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