database/sql Лекция 7 Синельников Илья * Способы работы с базами данных - database/sql - любые SQL базы данных - всё остальное * database/sql - абстракция для работы с SQL базами данных - набор интерфейсов для написания драйверов - многие драйверы имеют "расширенный" функционал - не умеет некоторые продвинутые возможности (например, батчинг) .code sql/driver.go /^type Driver/,/^}/ .code sql/driver.go /^type QueryerContext/,/^}/ * Подключение - database/sql .code open/sql.go * Подключение - на прямую .code open/pgx.go * Основные сущности - DB - connection pool к базе - Rows - результаты запроса - Row - одна строка из результата запроса - Null* - типы для работы с Null значениями - Tx - транзакция - Stmt - подготовленый запрос - Conn - одно подключение к базе * Проверка доступности .code alive/ping.go /^func IsItAliveQuestionMark/,/^}/ * Запрос с получением результатов .code query/query.go /^func Query/,/^}/ * Запрос с получением одного результата .code query/queryrow.go /^func QueryRow/,/^}/ * Запрос без результатов .code exec/exec.go /^func Exec/,/^}/ Возвращаемый тип .code exec/result.go /^type Result/,/^}/ * Именованые аргументы - реализуются на уровне драйвера .code named/named.go /^type NamedArg/,/^}/ * Именованые аргументы - использование .code named/insert.go /^func Insert/,/^}/ * Nulls .code nulls/nulls.go /^type NullString/,/^}/ * Null в аргументах .code nulls/insert.go /^func Insert/,/^}/ Передаём значения .code nulls/insert.go /^func DoStuff/,/^}/ * Null в результатах .code nulls/rows.go /^func Results/,/^}/ * Prepared Statements Плюсы: - решают проблему sql-injection - производительность Минусы: - удобство - производительность * Prepare .code prepare/prepare.go /^func Prepare/,/^}/ * Одно подключение .code conn/conn.go /^func Conn/,/^}/ * Транзакции .code tx/tx.go /^func Begin/,/^}/ * Типовые ошибки и подводные камни * Запросы - deadlock .code resources/queries.go /^func QueryDeadlock/,/^}/ * Запросы - deadlock - fix 1 .code resources/queries.go /^func QueryDeadlockFixOne/,/^}/ * Запросы - deadlock - fix 2 .code resources/queries.go /^func QueryDeadlockFixTwo/,/^}/ * Запросы - исчерпание ресурсов .code resources/rows.go /^func RowsExhaust/,/^}/ * Транзакции - исчерпание ресурсов .code resources/tx.go /^func TxExhaust/,/^}/ * Транзакции - deadlock .code resources/tx.go /^func TxDeadlock/,/^}/ * Коннекты - исчерпание ресурсов .code resources/conn.go /^func ConnExhaust/,/^}/ * Удобства и расширения * github.com/jmoiron/sqlx - drop-in replacement для database/sql - добавляет множество вспомогательных методов - реализует именованые аргументы * sqlx - подключение .code sqlx/open.go * sqlx - обобщенный интерфейс .code sqlx/ext.go /^type QueryerContext/,/^}/ .code sqlx/ext.go /^type ExecerContext/,/^}/ .code sqlx/ext.go /^type ExtContext/,/^}/ * sqlx - StructScan func (r *Rows) StructScan(dest interface{}) error func (r *Row) StructScan(dest interface{}) error func StructScan(rows rowsi, dest interface{}) error type rowsi interface { Close() error Columns() ([]string, error) Err() error Next() bool Scan(...interface{}) error } * sqlx - StructScan на практике .code sqlx/structscan.go /^func Example/,/^}/ * sqlx - именованые аргументы - работают для любого драйвера - тоже защищают от SQL-injection .code sqlx/named.go /^func Insert/,/^}/ * Нетипичные драйверы * Нетипичные драйверы - github.com/DATA-DOG/go-sqlmock .play -edit sqlmock/sqlmock_test.go /^func TestSelect/,/^}/ * Нетипичные драйверы - github.com/ClickHouse/clickhouse-go .code clickhouse/clickhouse.go /^func Example/,/^}/ * Не-SQL драйверы - Redis .code redis/redis.go /^func Example/,/^}/ * ORM - github.com/jinzhu/gorm - github.com/go-pg/pg * Популярные базы данных и их драйверы Совместимые с database/sql: .link https://github.com/jackc/pgx - PostgreSQL .link https://github.com/go-sql-driver/mysql - MySQL .link https://github.com/ClickHouse/clickhouse-go - ClickHouse Разное: .link https://github.com/go-redis/redis - Redis .link https://github.com/mongodb/mongo-go-driver - MongoDB