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

OSCHINA-MIRROR/didiopensource-gendry

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

gendry — это библиотека Go, которая помогает работать с базой данных. Она основана на go-sql-driver/mysql и предоставляет ряд простых, но полезных инструментов для подготовки параметров для вызова методов в стандартной библиотеке database/sql.

Название gendry происходит от роли в популярном сериале «Игра престолов», в котором Гендри является не только бастардом покойного короля Роберта Баратеона, но и искусным кузнецом. Подобно герою сериала, эта библиотека также создаёт нечто под названием SQL.

gendry состоит из трёх изолированных частей, и вы можете использовать каждую из них частично:

  • manager;
  • builder;
  • scanner;
  • CLI tool.

Manager

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&...&paramN=valueN]

Менеджер основан на go-mysql-driver/mysql. Если вы не знаете некоторые функции менеджера и серии SetXXX, см. их на домашней странице mysql-драйвера на GitHub. Более подробную информацию см. в документации менеджера (manager/README.md).

Builder

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 — это глобальная настройка, и её можно вызвать только один раз.

ScanMap

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:

  • Не забудьте закрыть строки, если вы не используете ScanXXXClose.
  • Второй параметр функции Scan должен быть ссылкой.

Инструменты

Помимо API, Gendry предоставляет [инструмент CLI](https://github.com/caibirdme/gforge), помогающий генерировать коды.

Комментарии ( 0 )

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

Введение

Gendry — это пакет Go, который помогает работать с базой данных. Он основан на go-sql-driver/mysql и предоставляет ряд методов для подготовки параметров при вызове методов стандартной библиотеки database/sql. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/didiopensource-gendry.git
git@api.gitlife.ru:oschina-mirror/didiopensource-gendry.git
oschina-mirror
didiopensource-gendry
didiopensource-gendry
master