shad-go/lectures/07-sql/sql.slide
2020-04-09 20:25:56 +03:00

208 lines
5.2 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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