database/sql, то для переключения с одной БД на другую достаточно указать новый драйвер и поправить синтаксис SQL-запросов, так как в разных СУБД он может различаться.$ sudo apt install mysql-server mysql-client
# далее нужно установить настройки безопасности
$ mysql_secure_installation $ sudo apt -y install postgresql
```
[Здесь](https://winitpro.ru/index.php/2019/10/25/ustanovka-nastrojka-postgresql-v-windows/){target="_blank"} вы найдёте подробную инструкцию по установке PostgreSQL на Windows, а [здесь](https://ruvds.com/ru/helpcenter/postgresql-pgadmin-ubuntu/){target="_blank"} — на Linux Ubuntu. [Здесь](https://wiki.postgresql.org/wiki/Russian/PostgreSQL-One-click-Installer-Guide){target="_blank"} — инструкция по установке на macOS.
Итак, вы установили СУБД. Чтобы начать с ней работать, нужно создать базу данных. Воспользуемся консольным клиентом `mysql` для MySQL и MariaDB, а также `psql` — для PostgreSQL.
Вот пример создания БД PostgreSQL на Linux:
```bash
$ sudo -i -u postgres
$ psql -U postgres
postgres=# create database dbname;
postgres=# create user username with encrypted password 'userpassword';
postgres=# grant all privileges on database dbname to username; dbname — это имя БД, username — имя пользователя, а userpassword — пароль пользователя.postgres=# create database videos;
postgres=# create user videos with encrypted password 'userpassword';
postgres=# grant all privileges on database videos to videos; sqlite3, чтобы импортировать csv-файл в БД SQLite.cgo включён, можно напрямую исполнять C-код, а результат использовать в Go-коде. Для применения cgo нужно дополнительно устанавливать C-компилятор.| База данных | Драйвер | Описание |
|---|---|---|
| SQLite | https://github.com/mattn/go-sqlite3 | Один из самых популярных пакетов для SQLite. Хорошая документация. Требует cgo. |
| SQLite | https://pkg.go.dev/modernc.org/sqlite | Не требует cgo. Написан на чистом Go. |
| MySQL | https://github.com/go-sql-driver/mysql/ | Не требует cgo. Быстрый и стабильный драйвер, поддерживает запросы более 16 Мб, соединение через IPv4, IPv6 и Unix domain sockets. Подробная документация. |
| MySQL | https://github.com/go-mysql-org/go-mysql | Это не только драйвер, но и набор утилит. Включает в себя инструменты репликаций, синхронизаций с другими БД, например Redis. |
| PostgreSQL | https://github.com/lib/pq | Популярная раньше библиотека, сейчас практически не поддерживается. Авторы рекомендуют использовать pgx. |
| PostgreSQL | https://github.com/jackc/pgx | Самый популярный драйвер для проекта с БД PostgreSQL. Быстрый, написан на чистом Go. Можно использовать как через драйвер, так и без пакета database/sql. Использование без пакета немного увеличит производительность, а также обеспечит поддержку дополнительных типов атрибутов. |
database/sql. Его особенность в том, что он написан обобщённо. Это означает, что все привязки к конкретному движку вынесены в драйвер.sql.DB.sql.DB — это интерфейс к драйверу базы данных. А драйвер — реализация интерфейса, который содержит логику работы с конкретной СУБД. Драйвер спроектирован так, что в коде не нужно вручную работать с базой данных и достаточно пользоваться только методами sql.DB. Код не зависит от драйвера, поэтому драйвер можно легко сменить.database/sql. Пул распределяет клиентов по разным соединениям и контролирует количество этих соединений, не тратя время на их повторное открытие.sql.DB. Благодаря ей можно сконфигурировать разные политики: установить фиксированное количество соединений или настроить динамическое открытие новых соединений (при повышенной нагрузке) и закрытие неиспользуемых по тайм-ауту.*sql.DB потокобезопасно. Можно обращаться к ней из разных горутин.sql.Open(driverName, dataSourceName string) (*DB, error) инициализирует переменную *sql.DB и создаёт пул соединений. Первым параметром функции Open() указывают драйвер, который будет использоваться для общения с базой данных. Второй аргумент — это строка для драйвера (её формат определяется самим драйвером), где указана необходимая информация для подключения к БД.import (
"database/sql"
_ "github.com/mattn/go-sqlite3"
) init()-функция, в которой драйвер зарегистрирует себя самостоятельно и будет доступен для использования через sql.DB.(db *DB) Close() error. Открывать и закрывать соединение в каждой функции не нужно — это снижает скорость работы программы. Пакет database/sql написан с расчётом на долговременное использование структуры sql.DB, что позволяет эффективно работать с пулом подключений.Open() вызывается один раз при запуске программы, а метод db.Close() — при завершении работы.go-sql-driver/mysql.go-sql-driver/mysql нужно указать имя драйвера mysql. Информация для подключения передаётся в формате [username[:password]@][protocol[(address)]]/dbname. В квадратных скобках — опциональные параметры. Иногда может быть указано только имя базы данных — /dbname.package main
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
func main() {
db, err := sql.Open("mysql", "user:password@/dbname")
// вот полный вариант
// db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/dbname")
if err != nil {
panic(err)
}
defer db.Close()
// ...
} pgx. Формат строки для подключения будет таким: host=host port=port user=myuser password=xxxx dbname=mydb sslmode=disable. Если используется стандартный для PostgreSQL порт 5432, его можно не указывать.package main
import (
"database/sql"
_ "github.com/jackc/pgx/v5/stdlib"
)
func main() {
ps := fmt.Sprintf("host=%s user=%s password=%s dbname=%s sslmode=disable",
`localhost`, `video`, `XXXXXXXX`, `video`)
db, err := sql.Open("pgx", ps)
if err != nil {
panic(err)
}
defer db.Close()
// ...
} modernc.org/sqlite, который реализован на чистом Go. В параметрах подключения укажем имя файла базы данных. Если файла не существует, то он будет создан.github.com/mattn/go-sqlite3. package main
import (
"database/sql"
_ "modernc.org/sqlite"
)
func main() {
// при использовании пакета go-sqlite3 имя драйвера — sqlite3
db, err := sql.Open("sqlite", "video.db")
if err != nil {
panic(err)
}
defer db.Close()
// ...
} sql.Open() не вернёт ошибку сразу. Вы получите её в тот момент, когда попытаетесь отправить SQL-запрос. Так происходит потому, что при использовании пакета database/sql соединение с БД устанавливается только после выполнения первого запроса. (db *DB) PingContext(ctx context.Context) error — он проверяет соединение и при необходимости восстанавливает его. Этот метод принимает контекст и возвращает ошибку, если соединение отсутствует и восстановить его невозможно.package main
import (
"context"
"database/sql"
"time"
_ "modernc.org/sqlite"
)
func main() {
db, err := sql.Open("sqlite", "video.db")
if err != nil {
panic(err)
}
defer db.Close()
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
defer cancel()
if err = db.PingContext(ctx); err != nil {
panic(err)
}
// ...
} csv-файл здесь.| атрибут | описание |
|---|---|
video_id | id видео на YouTube, например: 2kyS6SvSYSE |
trending_date | дата, когда видео было в топе: 17.14.11 |
title | название: WE WANT TO TALK ABOUT OUR MARRIAGE |
channel_title | название канала: CaseyNeistat |
category_id | id категории видео: 2 |
publish_time | время публикации: 2017-11-13T17:13:01.000Z |
tags | теги через |: "Shantell"|"martin"| |
views | количество просмотров: 4949484 |
likes | количество лайков: 488499 |
dislikes | количество дислайков: 8484 |
comment_count | количество комментариев: 4884 |
thumbnail_link | ссылка на заставку: https://i.ytimg.com/vi/2kyS6SvSYSE/default.jpg |
comments_disabled | отключены ли комментарии |
ratings_disabled | отключён ли рейтинг видео |
video_eror_or_removed | было ли видео удалено |
description | описание видео |
csv-файла в БД вам понадобится консольный клиент sqlite3. Скачайте zip-архив с готовыми исполняемыми файлами для вашей ОС.sqlite3 и загрузите данные напрямую из csv в новую таблицу:sqlite3 просто создаст новую базу.$ ./sqlite3 video.db videos. Можно и не создавать, но тогда при импорте csv-файла все поля по умолчанию получат тип TEXT. С такой таблицей в Go работать неудобно, её трудно конвертировать в структуру языка — потеряется типизация.CREATE TABLE videos(
"video_id" TEXT,
"trending_date" TEXT,
"title" TEXT,
"channel_title" TEXT,
"category_id" INTEGER,
"publish_time" TEXT,
"tags" TEXT,
"views" INTEGER,
"likes" INTEGER,
"dislikes" INTEGER,
"comment_count" INTEGER,
"thumbnail_link" TEXT,
"comments_disabled" BOOLEAN,
"ratings_disabled" BOOLEAN,
"video_error_or_removed" BOOLEAN,
"description" TEXT
); INTEGER, REAL, TEXT и BLOB. Значение колонки может быть любым из этих типов, независимо от типа, указанного при создании таблицы.USvideos.csv в ту же директорию, куда распакованы исполняемые файлы sqlite. Переключитесь в режим csv и импортируйте данные из csv-файла в таблицу videos:sqlite> .mode csv videos
sqlite> .import USvideos.csv videos sqlite> SELECT COUNT(*) From videos;
40950 csv-файл, то увидите, что количество строк будет больше 48 000. Дело в том, что некоторые записи содержат текст с переводом строк в двойных кавычках.csv:sqlite> .mode table
sqlite> SELECT video_id,title, views from videos ORDER BY views LIMIT 10; | video_id | title | views |
|---|---|---|
| y6KYFcta4SE | 1 dead, others injured after Ky. school shooting | 554 |
| y6KYFcta4SE | 1 dead, others injured after Ky. school shooting | 559 |
| dQMZLXaa1L8 | Artwork Forge | 658 |
| -JVITToppE0 | Coach Taggart Monday Presser Ahead of Arizona | 687 |
| -JVITToppE0 | Coach Taggart Monday Presser Ahead of Arizona | 704 |
| dQMZLXaa1L8 | Artwork Forge | 713 |
| dQMZLXaa1L8 | Artwork Forge | 745 |
| zeQaJGkFyqQ | Raw: 3 South Carolina Deputies, 1 Officer Shot | 748 |
| qg0GdM60syI | Huffy Metaloid Bicycle Commercial 1997 | 773 |
| JNv4w6DFoYs | OjO Commuter Scooter®- Light Electric Vehicle for the Bike Lane & Beyond! | 789 |
csv-файла импортированы корректно, структура данных передана верно.sqlite> SELECT title, channel_title, views from videos
WHERE views = (SELECT MAX(views) from videos); title, channel_title и views. Всё просто. Так как вы предварительно создали таблицу и уже потом импортировали данные, первая строка из csv-файла с заголовками столбцов попала в таблицу. Удалите эту запись:sqlite> DELETE from videos where video_id = 'video_id'; sqlite> SELECT title, channel_title, views from videos
WHERE views = (SELECT MAX(views) from videos); | title | channel_title | views |
|---|---|---|
| Childish Gambino — This Is America (Official Video) | ChildishGambinoVEVO | 225211923 |
sqlite3 вы создали таблицу в базе данных SQLite и импортировали туда информацию из csv-файла. Эта таблица пригодится вам в следующем воркшопе, где мы расскажем, как на Go выполнять SELECT-запросы к базе данных.database/sql.