February 6, 2021

Как скормить 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 сталкивались вы?