sql - 如何在 go-pg(带 Go 的 Postgres ORM)中查询嵌套结构中的子字段?

标签 sql postgresql go 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 方法(在旧版本的 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
}

关于sql - 如何在 go-pg(带 Go 的 Postgres ORM)中查询嵌套结构中的子字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55735195/

相关文章:

java - 你能在一个 SQL 语句中返回多个 COUNTs 吗?

mysql - 如何在不在 SQL 中创建重复行的情况下进行更新?

sql - PostgreSQL 表的测试数据

go - 为什么 Revel JSON 响应中的所有键都不大写?

php - 查询未插入数据库

sql - 有没有办法用十六进制表示 Postgres 文字 int?

postgresql - Clojure postgresql : how do I drop the database?

postgresql - 环回索引 - 如何在模型定义中指定不同的索引类型?

go - 如何在go中定义标志组?

go - 如何以编程方式确定 pod 是否处于 crashloopbackoff 状态