Как я могу запросить подполе во вложенных структурах в go-pg (Postgres ORM с Go)? - PullRequest
1 голос
/ 17 апреля 2019

Я новичок в базах данных SQL ORM и пишу код на Golang, который работает с базой данных PostgresQL.У меня есть эти вложенные структуры:

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, но я новичок в этом.Буду признателен за помощь.

...