====== Базы данных ======
Самые популярные базы данных — реляционные. В их основе лежат таблицы связанные ключами. Большинство из них поддерживают взаимодействие с помощью некоторого подмножества или надмножества языка SQL.
Работа с такими базами данных возможна через SQL команды или механизм ORM. В последнем случае промежуточная библиотека транслирует содержимое базы в Python объекты.
===== Основы SQL =====
Чуть более подробное введение, вы можете найти [[https://proglib.io/p/sql-for-20-minutes/|тут]].
==== Создание таблиц ====
Следующий код создает таблицу с именем ''months'' и тремя столбцами: ''id'' типа целое число, ''title'' типа строка до 16 символов и ''days'' типа число.
CREATE TABLE `months` (`id` INT,
`title` VARCHAR(16),
`days` INT);
==== Некоторые типы данных ====
Типы данных в разных БД есть разные, а их машинное представление зависит от используемой СУБД, тем не менее, вот некоторые:
^ Тип ^ Значение ^
| INT | Целое число |
| REAL | Число с плавающей запятой |
| DECIMAL(M,D) | Число с фиксированным количеством знаков M - всего, D - после запятой |
| VARCHAR(L) | Строка заданной длинны L |
| TEXT | Текст неопределенной длинны |
| BLOB | Двоичный объект неопределенной длинны |
==== Добавление данных ====
Следующий код добавляет в таблицу две строки:
INSERT INTO `months` (`id`, `title`, `days`) VALUES
(1, "Январь", 31),
(2, "Февраль", 29),
(3, "Март", 31);
==== Изменение данных ====
Изменим значение в одной из строк:
UPDATE `months` SET `title` = "January" WHERE `id` = 1;
==== Чтение данных ====
Безусловное чтение
SELECT * FROM `months`;
Условное чтение
SELECT `title` FROM `months` WHERE `days` > 30;
===== Автоматическое создание SQL запросов =====
Чтобы не строить SQL запросы конкатенацией строк, есть хороший модуль ''pypika''pip.
from pypika import Query, Table
months = Table('months')
# INSERT INTO `months` VALUES (1, "Январь", 31)
Query.into(months).columns('id', 'title', 'days').insert((1, "Январь", 31))
# UPDATE `months` SET `title` = "January" WHERE `id` = 1;
Query.update(months).set(months.title, "January").where(months.id == 1)
# SELECT `title` FROM `months` WHERE `days` > 30;
Query.from_(months).select('title').where(months.days > 30)
==== Файловая база данных sqlite ====
Большинство модулей для работы с БД в Python следуют Python DB-API (PEP-249), поэтому их интерфейс очень похож.
Типичный процесс работы с БД: открыть базу, создать курсор, поработать с базой, сохранить изменения, закрыть базу.
import sqlite3
# Открываем базу
conn = sqlite3.connect('test.sqlite')
# Создаем курсор
cur = conn.cursor()
# Работаем с базой через курсор
# Сохраняем изменения
conn.commit()
# Закрываем базу
conn.close()
=== Запись ===
# Создаем таблицу
cur.execute('''CREATE TABLE `stocks`
(`label` TEXT,
`qty` INT,
`price` REAL)''')
# Добавляем данные по одной строке
cur.execute('''INSERT INTO `stocks`
VALUES (?, ?, ?)''',
('RHAT', 100, 35.14))
# Добавляем данные списком
cur.executemany('''INSERT INTO `stocks`
VALUES (?, ?, ?)''',
[('NIYR', 13, 45.00),
('SJE', 77, 5.00)])
# Сохраняем изменения
conn.commit()
=== Чтение ===
cur.execute('SELECT * from `stocks`')
# Курсор помнит последний запрос и место
# до которого был прочитан результат
# Одна строка
cur.fetchone()
# ('RHAT', 100, 35.14)
# Не более 2 строк
cur.fetchmany(2)
# [('NIYR', 13, 45.0), ('SJE', 77, 5.0)]
# Все строки (пусто, все строки вычитаны)
cur.fetchall()
# None
==== Клиент-серверные базы данных ====
С килент-серверными БД работа выглядит точно также, только нужны дополнительные модули и реквизиты сервера. На примере MySql (модуль ''MySQLdb''[pip]):
import MySQLdb
# Подключение к базе
con = MySQLdb.connect(host='127.0.0.1',
port=3306,
user='user',
passwd='password',
db='mydatabase')
# Получение курсора
cur = con.cursor()
# Работа с базой
# Сохранение изменений
con.commit()
# Закрытие соединения
con.close()
==== Модули для баз данных ====
=== Реляционные клиент-серверные ===
^ Название ^ Модуль ^
| MySQL / MariaDB | [[http://mysql-python.sourceforge.net/MySQLdb.html|MySQLdb]][pip] |
| PostgreSQL | [[http://initd.org/psycopg/docs/|psycopg2]][pip] |
| Microsoft SQL | [[http://www.pymssql.org/en/stable/|pymssql]][pip] |
=== Не реляционные ===
^ Тип БД ^ Представитель ^ Модуль ^
| Ключ-Значение | [[https://redis.io/topics/quickstart|Redis]] | [[https://pypi.python.org/pypi/redis|redis]][pip] |
| Документ ориентированные | [[http://docs.couchdb.org/en/2.1.1/|CouchDB]] | [[https://pythonhosted.org/CouchDB/|couchdb]][pip] |
| Временные ряды | [[https://docs.influxdata.com/influxdb/v1.3/introduction/getting_started/|InfluxDB]] | [[https://influxdb-python.readthedocs.io/en/latest/|influxdb]][pip] |