sql - 如何在 go-pg 中查询嵌套结构中的子字段(带有 Go 的 Postgres ORM)?
问题描述
我是 SQL ORM 数据库的新手,我正在使用与 PostgresQL 数据库一起使用的 Golang 编写代码。我有这个嵌套结构:
type PersonalInfo struct {
Name string `sql:"name"`
Telephone string `sql:"telephone"`
Email string `sql:"email"`
Age string `sql:"age"`
Gender string `sql:"gender"`
City string `sql:"city"`
}
type DB_SessionInfo struct {
Coockie string
}
type DB_User struct {
ID int `sql:"id, pk"`
Username string `sql:"username,unique"`
Password string `sql:"password"`
PersonalInfo PersonalInfo `sql:"personalinfo, type:jsonb"`
SessionInfo DB_SessionInfo `sql:"session_info, type:jsonb"`
}
如果我试图通过 选择项目username
,我使用上面的代码并且效果很好:
func (u *DB_User) GetItemByName(db *pg.DB) error {
err := db.Model(u).Where("username = ?0", u.Username).Select()
if err != nil {
fmt.Printf("Error while getting value by *username*. Reason: %v\n", err)
return err
}
fmt.Printf("Get by *username* successful for <%v>\n", u)
return nil
}
在对数据库的每个请求之前,我都会连接到这个并通过上面的代码创建表:
func someFunction() {
database := ConnectToDB()
defer database.Close()
// some code
DB_Entry := new(db.DB_User)
DB_Entry.Username = "Username"
DB_Entry.GetItemByName(database)
}
func ConnectToDB() *pg.DB {
database := pg.Connect(&pg.Options{
User: "postgres",
Password: "postgres",
Database: "postgres",
})
fmt.Println("\nSuccessful connection to DB")
err := createSchema(database)
if err != nil {
panic(err)
} else {
fmt.Println("Schema created")
}
return database
}
func createSchema(database *pg.DB) error {
for _, model := range []interface{}{(*db.DB_User)(nil), (*db.PersonalInfo)(nil)} {
err := database.CreateTable(model, &orm.CreateTableOptions{
IfNotExists: true,
})
if err != nil {
return err
}
}
return nil
}
所以,当我想personalinfo.name == "some_name"
通过这个代码选择项目时,我有错误。代码:
func (u *DB_User) AnotherGetItemByName(db *pg.DB) error {
err := db.Model(u).Where("personalinfo.name = ?0", u.PersonalInfo.Name).Select()
return err
}
return nil
}
错误:
ERROR #42P01 table "personalinfo" doesn`t exist
所以我的问题是,我做错了什么?选择功能中的错误请求?也许在函数中创建表的错误createSchema
?
我试图在 stackoverflow 中找到答案并阅读 go-pg 文档,但找不到解决方案。我确信它有非常简单的解决方案,它是使用 sql 的基本点,但我是新手。我将不胜感激。
解决方案
您需要告诉 ORM 使用该Relation
方法(Column
在旧版本的 go-pg 上)在 PersonalInfo 表上创建一个 JOIN 语句。
func (u *DB_User) AnotherGetItemByName(db *pg.DB) error {
err := db.Model(u).Relation("PersonalInfo").Where("PersonalInfo.name = ?", u.PersonalInfo.Name).Select()
return err
}
return nil
}
推荐阅读
- java - Java Generic 不推断类型
- .net-core - 在 OS X 上启动 .NET Core 应用程序时出现 OnConnectionAsync 方法问题
- linux - 从 CSV 文件中获取条目并将其写入配置文件 freeRADIUS 的 Linux 脚本
- python - 计数值 Pandas 并与其他数据框结合
- c# - 始终获取主显示器 DPI
- ibm-cloud-private - 启用 \"va\" 服务时必须设置 \"va\" 主机组 - 安装错误
- php - 动态列表框 - 我的知识有很多空白
- drools - 在一个时间范围内检测一定数量的事件,但只触发一次
- ios - IOS - 如何从 WKWebView 获取缓存的资源?
- java - PagingAndSortingRepository 如何排序不区分大小写?