clauses difficult:
SELECT * FROM users WHERE level IN (?);
sqlx.In
инкапсулирован в gosql
и может быть запрошен с использованием следующей схемы:
var levels = []int{4, 6, 7}
rows, err := gosql.Queryx("SELECT * FROM users WHERE level IN (?);", levels)
//или
user := make([]*Users, 0)
err := gosql.Select(&user, "select * from users where id in(?)",[]int{1,2,3})
В библиотеке gosql
используется структура Golang для выражения отношений между таблицами. Нужно использовать тег relation
, чтобы указать связанное поле.
⚠️ Начиная с версии v2, запрос отношения через библиотечные соединения должен быть указан с помощью тега connection
.
type MomentList struct {
models.Moments
User *models.Users `json:"user" db:"-" relation:"user_id,id"` //one-to-one
Photos []*models.Photos `json:"photos" db:"-" relation:"id,moment_id" connection:"db2"` //one-to-many
}
Получить один результат:
moment := &MomentList{}
err := gosql.Model(moment).Where("status = 1 and id = ?",14).Get()
//вывод User и Photos и получение результата
SQL:
2018/12/06 13:27:54
Query: SELECT * FROM `moments` WHERE (status = 1 and id = ?);
Args: []interface {}{14}
Time: 0.00300s
2018/12/06 13:27:54
Query: SELECT * FROM `moment_users` WHERE (id=?);
Args: []interface {}{5}
Time: 0.00081s
2018/12/06 13:27:54
Query: SELECT * FROM `photos` WHERE (moment_id=?);
Args: []interface {}{14}
Time: 0.00093s
Получить список результатов, многие ко многим:
var moments = make([]*MomentList, 0)
err := gosql.Model(&moments).Where("status = 1").Limit(10).All()
//получение общего результата для среза *UserMoment
SQL:
2018/12/06 13:50:59
Query: SELECT * FROM `moments` WHERE (status = 1) LIMIT 10;
Time: 0.00319s
2018/12/06 13:50:59
Query: SELECT * FROM `moment_users` WHERE (id in(?));
Args: []interface {}{[]interface {}{5}}
Time: 0.00094s
2018/12/06 13:50:59
Query: SELECT * FROM `photos` WHERE (moment_id in(?, ?, ?, ?, ?, ?, ?, ?, ?, ?));
Args: []interface {}{[]interface {}{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}
Time: 0.00087s
Relation Where:
moment := &MomentList{}
err := gosql.Relation("User" , func(b *gosql.ModelStruct) {
//это экземпляр Builder
b.Where("gender = 0")
}).Get(moment , "select * from moments")
Хуки — это функции, которые вызываются до или после создания/запроса/обновления/удаления.
Если вы определили методы для модели, они будут вызываться автоматически при создании, обновлении, запросе, удалении, и если любой обратный вызов возвращает ошибку, gosql
остановит будущие операции и откатит текущую транзакцию.
// начало транзакции
BeforeChange
BeforeCreate
// обновление временных меток `CreatedAt`, `UpdatedAt`
// сохранение
AfterCreate
AfterChange
// фиксация или откат транзакции
Пример:
func (u *Users) BeforeCreate() (err error) {
if u.IsValid() {
err = errors.New("can't save invalid data")
}
return
}
func (u *Users) AfterCreate(tx *gosql.DB) (err error) {
if u.Id == 1 {
u.Email = "after@test.com"
tx.Model(u).Update()
}
return
}
BeforeChange и AfterChange используются только при создании/обновлении/удалении
Все хуки:
BeforeChange
AfterChange
BeforeCreate
AfterCreate
BeforeUpdate
AfterUpdate
BeforeDelete
AfterDelete
BeforeFind
AfterFind
Тип функции хука поддерживает несколько способов:
func (u *Users) BeforeCreate()
func (u *Users) BeforeCreate() (err error)
func (u *Users) BeforeCreate(tx *gosql.DB)
func (u *Users) BeforeCreate(tx *gosql.DB) (err error)
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )