#sql #postgresql #go #orm
#sql #postgresql #Вперед #орм
Вопрос:
Я новичок в базах данных 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: %vn", 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(amp;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, amp;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, но я новичок в этом. Я буду признателен за помощь.
Ответ №1:
Вам нужно сообщить ORM, чтобы он сделал оператор JOIN в таблице PersonalInfo, используя Relation
метод ( Column
в более старых версиях go-pg).
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
}