【发布时间】:2020-09-02 23:37:20
【问题描述】:
正在运行查询以检查表是否存在,使用 gorm orm for golang。下面是我的代码。
package main
import (
"fmt"
"log"
"gorm.io/driver/postgres"
"gorm.io/gorm"
_ "github.com/lib/pq"
)
// App sets up and runs the app
type App struct {
DB *gorm.DB
}
`const tableCreationQuery = `SELECT count (*)
FROM information_schema.TABLES
WHERE (TABLE_SCHEMA = 'api_test') AND (TABLE_NAME = 'Users')`
func ensureTableExists() {
if err := a.DB.Exec(tableCreationQuery); err != nil {
log.Fatal(err)
}
}`
预期的响应应该是 1 或 0。我是从另一个 SO 答案中得到的。相反,我得到了这个
2020/09/03 00:27:18 &{0xc000148900 1 0xc000119ba0 0} 退出状态 1 FAIL go-auth 0.287s
我未经训练的头脑说它是一个指针,但我如何引用返回的值来确定其中包含什么?
【问题讨论】:
-
(*gorm.DB).Exec不会返回错误,如果您想查看您的查询是否失败或未使用 gorm 读取 error handling。当你不关心输出时使用Exec,当你确实关心输出时使用Raw(更多here)。此外,检查数据库中是否存在某些内容的惯例是使用SELECT EXISTS (SELECT 1 FROM ...)而不是计数。 -
@mkopriva,感谢您的回答。您建议的命令确实运行,我在下面添加了它。我仍然不清楚如何检查返回的结果。我收到了 1 或 0 还是空数组。如果您能提供帮助,那就太好了。再次感谢。 func ensureTableExists() { dbname := "api_test" tablename := "User" err := a.DB.Raw("SELECT EXISTS(SELECT * FROM information_schema.tables WHERE table_schema=?AND table_name=?)", dbname, tablename ).Error if err != nil { fmt.Print("no error") } }
-
只要您需要查询结果,就需要扫描它。以下是使用标准库 stackoverflow.com/questions/49449087/… 的方法,这里是 gorm 和 Raw github.com/rl404/point-system/blob/… 的示例。
-
@mkopriva。那太好了,谢谢!正在学习golang,一开始就结合tdd。
标签: sql postgresql go go-gorm