1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/fifsky-gosql

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 4.4 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 30.11.2024 12:32 9cf4081

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})

Relation

В библиотеке 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")

Hooks

Хуки — это функции, которые вызываются до или после создания/запроса/обновления/удаления.

Если вы определили методы для модели, они будут вызываться автоматически при создании, обновлении, запросе, удалении, и если любой обратный вызов возвращает ошибку, 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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/fifsky-gosql.git
git@api.gitlife.ru:oschina-mirror/fifsky-gosql.git
oschina-mirror
fifsky-gosql
fifsky-gosql
master