Базы данных
Самые популярные базы данных — реляционные. В их основе лежат таблицы связанные ключами. Большинство из них поддерживают взаимодействие с помощью некоторого подмножества или надмножества языка 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 запросы конкатенацией строк, есть хороший модуль 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()