[英]How can I querying a subfield in nested structures in go-pg (Postgres ORM with Go)?
我是 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
方法(舊版本的 go-pg 上的Column
)在 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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.