gendry — это библиотека Go, которая помогает работать с базой данных. Она основана на go-sql-driver/mysql и предоставляет ряд простых, но полезных инструментов для подготовки параметров для вызова методов в стандартной библиотеке database/sql.
Название gendry происходит от роли в популярном сериале «Игра престолов», в котором Гендри является не только бастардом покойного короля Роберта Баратеона, но и искусным кузнецом. Подобно герою сериала, эта библиотека также создаёт нечто под названием SQL.
gendry состоит из трёх изолированных частей, и вы можете использовать каждую из них частично:
Manager используется для инициализации пула соединений с базой данных (то есть sql.DB). Вы можете установить почти все параметры для тех драйверов MySQL, которые поддерживаются. Например, инициализация пула подключений к базе данных:
var db *sql.DB
var err error
db, err = manager
.New(dbName, user, password, host)
.Set(
manager.SetCharset("utf8"),
manager.SetAllowCleartextPasswords(true),
manager.SetInterpolateParams(true),
manager.SetTimeout(1 * time.Second),
manager.SetReadTimeout(1 * time.Second)
).Port(3302).Open(true)
На самом деле всё, что делает менеджер, — это просто генерирует dataSourceName. Формат dataSourceName:
[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...¶mN=valueN]
Менеджер основан на go-mysql-driver/mysql. Если вы не знаете некоторые функции менеджера и серии SetXXX, см. их на домашней странице mysql-драйвера на GitHub. Более подробную информацию см. в документации менеджера (manager/README.md).
Builder, как следует из названия, предназначен для создания SQL. Написание SQL вручную интуитивно понятно, но несколько сложно поддерживать. А для where in, если у вас огромное количество элементов в наборе in, написать его очень трудно.
Builder — это не ORM. На самом деле одна из главных причин, по которой мы создали Gendry, заключается в том, что нам не нравятся ORM. Поэтому Gendry просто предоставляет несколько простых API, которые помогут вам создавать SQL:
where := map[string]interface{}{
"city": []string{"beijing", "shanghai"},
// The in operator can be omitted by default,
// which is equivalent to:
// "city in": []string{"beijing", "shanghai"},
"score": 5,
"age >": 35,
"address": builder.IsNotNull,
"_or": []map[string]interface{}{
{
"x1": 11,
"x2 >=": 45,
},
{
"x3": "234",
"x4 <>": "tx2",
},
},
"_orderby": "bonus desc",
"_groupby": "department",
}
table := "some_table"
selectFields := []string{"name", "age", "sex"}
cond, values, err := builder.BuildSelect(table, where, selectFields)
//cond = SELECT name,age,sex FROM some_table WHERE (((x1=? AND x2>=?) OR (x3=? AND x4!=?)) AND score=? AND city IN (?,?) AND age>? AND address IS NOT NULL) GROUP BY department ORDER BY bonus DESC
//values = []interface{}{11, 45, "234", "tx2", 5, "beijing", "shanghai", 35}
rows, err := db.Query(cond, values...)
// support builder.Raw in where & update
where := map[string]interface{}{"gmt_create <": builder.Raw("gmt_modified")}
cond, values, err := builder.BuildSelect(table, where, selectFields)
// SELECT * FROM x WHERE gmt_create < gmt_modified
update = map[string]interface{}{
"code": builder.Raw("VALUES(code)"), // mysql 8.x builder.Raw("new.code")
"name": builder.Raw("VALUES(name)"), // mysql 8.x builder.Raw("new.name") **Таблица имеет тип varchar (хранимая легальная строка JSON) или json (MySQL 5.7)**
var student human
err := scanner.Scan(rows, &student)
// ...
The extra tag of the struct будет использоваться сканером для разрешения данных из ответа. Имя тега по умолчанию — ddb:"tagname"
, но вы можете указать своё собственное, например:
scanner.SetTagName("json")
type Person struct {
Name string `json:"name"`
Age int `json:"m_age"`
}
// ...
var student Person
scanner.Scan(rows, &student)
scanner.SetTagName — это глобальная настройка, и её можно вызвать только один раз.
rows, _ := db.Query("select name, age as m_age from person")
result, err := scanner.ScanMap(rows)
for _, record := range result {
fmt.Println(record["name"], record["m_age"])
}
ScanMap сканирует данные из строк и возвращает []map[string]interface{}
.
Типы int, float, string могут быть сохранены как []uint8 драйвером MySQL. ScanMap копирует эти значения в карту. Если вы уверены, что в вашей таблице MySQL нет двоичных типов данных (в большинстве случаев это так), вы можете использовать ScanMapDecode, который преобразует []uint8 в int, float64 или string.
Для получения более подробной информации см. документацию сканера.
PS:
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )