592 подписчика

Как скормить Python любую базу данных

167 прочитали

Как сделать работу с реляционной базой данных в Python универсальной, не  заботясь о написании sql кода и спецификах взаимодействия с разными типами баз данных. Об этом я и расскажу в этой статье.

Как сделать работу с реляционной базой данных в 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()

Как сделать работу с реляционной базой данных в Python универсальной, не  заботясь о написании sql кода и спецификах взаимодействия с разными типами баз данных. Об этом я и расскажу в этой статье.-2

Как сделать работу с реляционной базой данных в Python универсальной, не  заботясь о написании sql кода и спецификах взаимодействия с разными типами баз данных. Об этом я и расскажу в этой статье.-3

Выборка

Для выборки данных из таблицы можно обратиться к методу select класса:

u_b = Person.select().where(Person.name=='Bob').get()
gr_m = Person.select().where(Person.name=='Alice').get()
Как сделать работу с реляционной базой данных в Python универсальной, не  заботясь о написании sql кода и спецификах взаимодействия с разными типами баз данных. Об этом я и расскажу в этой статье.-4

Следует отметить, что по полю ForeignKeyField можно получить доступ к связанным объектам. Например, выведем списки людей и свызанных с ними животных:

Как сделать работу с реляционной базой данных в Python универсальной, не  заботясь о написании sql кода и спецификах взаимодействия с разными типами баз данных. Об этом я и расскажу в этой статье.-5

Другой способ вставки

Помимо указанного выше существует и другой способ вставки новой записи в таблицу. В частности, можно сделать это, обратившись к методу create класса:

b_kit = Pet.create(owner=u_b, name = 'Kit', animal = 'cat')
b_kit2 = Pet.create(owner=gr_m, name =
'Tusik', animal = 'dog')

Как сделать работу с реляционной базой данных в Python универсальной, не  заботясь о написании sql кода и спецификах взаимодействия с разными типами баз данных. Об этом я и расскажу в этой статье.-6

И это только начало, а с какими способами работы с базами данных из Python сталкивались вы?