171 lines
3.9 KiB
Text
171 lines
3.9 KiB
Text
|
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
|
|||
|
|
|||
|
* Запрос с получением результатов
|
|||
|
|
|||
|
.code query/query.go
|
|||
|
|
|||
|
* Запрос с получением одного результата
|
|||
|
|
|||
|
.code query/queryrow.go
|
|||
|
|
|||
|
* Запрос без результатов
|
|||
|
|
|||
|
.code exec/exec.go
|
|||
|
|
|||
|
Возвращаемый тип
|
|||
|
.code exec/result.go
|
|||
|
|
|||
|
* Nulls
|
|||
|
|
|||
|
.code nulls/nulls.go
|
|||
|
|
|||
|
* Null в аргументах
|
|||
|
|
|||
|
Передаём null
|
|||
|
.code nulls/insert_null.go
|
|||
|
Передаём значение
|
|||
|
.code nulls/insert_value.go
|
|||
|
|
|||
|
* Null в результатах
|
|||
|
.code nulls/rows.go
|
|||
|
|
|||
|
* Именованые аргументы
|
|||
|
- реализуются на уровне драйвера
|
|||
|
|
|||
|
.code named/named.go
|
|||
|
|
|||
|
|
|||
|
* Именованые аргументы - использование
|
|||
|
.code named/insert.go
|
|||
|
|
|||
|
* Prepared Statements
|
|||
|
|
|||
|
Плюсы:
|
|||
|
- решают проблему sql-injection
|
|||
|
- производительность
|
|||
|
|
|||
|
Минусы:
|
|||
|
- удобство
|
|||
|
- производительность
|
|||
|
|
|||
|
* Prepare
|
|||
|
|
|||
|
.code prepare/prepare.go
|
|||
|
|
|||
|
* Одно подключение
|
|||
|
|
|||
|
.code conn/conn.go
|
|||
|
|
|||
|
* Транзакции
|
|||
|
|
|||
|
.code tx/tx.go
|
|||
|
|
|||
|
* Типовые ошибки и подводные камни
|
|||
|
|
|||
|
* Deadlock
|
|||
|
|
|||
|
- ПРИМЕР много SQL вызовов подряд без вычитки данных
|
|||
|
|
|||
|
* Исчерпание ресурсов
|
|||
|
|
|||
|
- ПРИМЕР незакрытие транзакций
|
|||
|
- ПРИМЕР незакрытие rows
|
|||
|
- ПРИМЕР неотдача коннектов
|
|||
|
|
|||
|
* Рефлексия
|
|||
|
|
|||
|
ПРИМЕР ColumnType
|
|||
|
|
|||
|
* Удобства и расширения
|
|||
|
|
|||
|
* github.com/jmoiron/sqlx
|
|||
|
|
|||
|
- drop-in replacement для database/sql
|
|||
|
- добавляет множество вспомогательных методов
|
|||
|
- реализует именованые аргументы
|
|||
|
|
|||
|
* sqlx - подключение
|
|||
|
|
|||
|
.code sqlx/open.go
|
|||
|
|
|||
|
* sqlx - обобщенный интерфейс
|
|||
|
|
|||
|
.code sqlx/ext.go
|
|||
|
|
|||
|
* sqlx - StructScan
|
|||
|
|
|||
|
.code sqlx/structscan.go
|
|||
|
|
|||
|
* sqlx - StructScan на практике
|
|||
|
|
|||
|
.code sqlx/example.go
|
|||
|
|
|||
|
* GORM
|
|||
|
|
|||
|
- ORM которая умеет всё
|
|||
|
- ORM которая не умеет ничего
|
|||
|
|
|||
|
* Моки
|
|||
|
|
|||
|
Здесь будет пара слайдов о github.com/DATA-DOG/go-sqlmock
|
|||
|
|
|||
|
* Нетипичные драйверы
|
|||
|
|
|||
|
- драйвер к кликхаусу использует транзакции как батчинг (ЗДЕСЬ БУДЕТ ПРИМЕР)
|
|||
|
|
|||
|
* Пример не-sql драйвера
|
|||
|
|
|||
|
ПРИМЕР go-redis
|
|||
|
|
|||
|
* Популярные базы данных и их драйверы
|
|||
|
|
|||
|
Совместимые с 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
|