Как скормить Python любую базу данных
Как сделать работу с реляционной базой данных в Python универсальной, не заботясь о написании sql кода и спецификах взаимодействия с разными типами баз данных. Об этом я и расскажу в этой статье.
Для перечисленных целей придумана абстракция ORM (Object Relational Mapping) - технология программирования, которая связывает базы данных с концепциями объектно-ориентированных языков программирования, создавая «виртуальную объектную базу данных» (Википедия).
Технологии ORM реализуются в библиотеке peewee, которая поддерживает работу с cockroachDB, postgresql, mysql и sqlite. Для ее установки достаточно воспользоваться менеджером пакетов pip:
pip install peewee
Вместе с тем для работы с конкретной базой в случае отсутствия ее поддержки в стандартном наборе библиотек Python может потребоваться скачать дополнительный модуль (как например, в случае с postgresql - psycopg2, подробнее читай здесь).
Настройка
Для работы инструментов peewee им необходимо иметь экземпляр подключения к конкретной базе данных. Например, в случае postgresql для этого можно набрать следующее:
from peewee import *
import psycopg2
db = PostgresqlDatabase(database='postgres', user='postgres', password='postgres', host='localhost')
На этом специфика заканчивается и последующая работа становится универсальной. Для создания и работы с таблицами нужно использовать классы специального вида. В частности, они должны наследовать класс Model, а также содержать внутренний класс Meta, в котором задаются метаданные, например, экземпляр подключения, список полей для индексирования и для сортировки по умолчанию...
Создание таблиц
Например, создадим два связанных класса, представляющих человека и домашнее животное с заданными наборами полей:
class Person(Model):
name = CharField()
birthday = DateField()
is_relative = BooleanField()
class Meta:
database = db
class Pet(Model):
owner = ForeignKeyField(Person,related_name='pets')
name = CharField()
animal = CharField()
class Meta:
database = db
В последующем данные классы можно отобразить на таблицы данных путем вызова метода create_table:
Person.create_table()
Pet.create_table()
Вставка
Для вставки данных в эти таблицы можно создать экземпляры классов и вызвать метод save:
u_b = Person(name='Bob', birthday=date(1960,1,15), is_relative=True)
u_b.save()
gr_m = Person(name='Alice', birthday = date(1936,1,2), is_relative = True)
gr_m.save()
b_kit3 = Pet(owner=u_b, name = 'Mit', animal = 'horse')
b_kit3.save()
Выборка
Для выборки данных из таблицы можно обратиться к методу select класса:
u_b = Person.select().where(Person.name=='Bob').get()
gr_m = Person.select().where(Person.name=='Alice').get()
Следует отметить, что по полю ForeignKeyField можно получить доступ к связанным объектам. Например, выведем списки людей и связанных с ними животных:
Другой способ вставки
Помимо указанного выше существует и другой способ вставки новой записи в таблицу. В частности, можно сделать это, обратившись к методу create класса:
b_kit = Pet.create(owner=u_b, name = 'Kit', animal = 'cat')
b_kit2 = Pet.create(owner=gr_m, name = 'Tusik', animal = 'dog')
И это только начало, а с какими способами работы с базами данных из Python сталкивались вы?