Базы данных

Самые популярные базы данных — реляционные. В их основе лежат таблицы связанные ключами. Большинство из них поддерживают взаимодействие с помощью некоторого подмножества или надмножества языка SQL.

Работа с такими базами данных возможна через SQL команды или механизм ORM. В последнем случае промежуточная библиотека транслирует содержимое базы в Python объекты.

Основы SQL

Чуть более подробное введение, вы можете найти тут.

Создание таблиц

Следующий код создает таблицу с именем 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 запросы конкатенацией строк, есть хороший модуль pypikapip.

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 MySQLdb[pip]
PostgreSQL psycopg2[pip]
Microsoft SQL pymssql[pip]

Не реляционные

Тип БД Представитель Модуль
Ключ-Значение Redis redis[pip]
Документ ориентированные CouchDB couchdb[pip]
Временные ряды InfluxDB influxdb[pip]