Все, что вам нужно знать о Python и объектно-реляционных картах

Все, что вам нужно знать о Python и объектно-реляционных картах

Возможно, вы слышали об объектно-реляционном отображении (ORM). Возможно, вы даже использовали один, но что именно? А как их использовать в Python?





Вот все, что вам нужно знать об ORM и Python.





Что такое ORM?

Объектно-реляционное сопоставление (ORM) - это метод программирования, используемый для доступа к базе данных. Он представляет вашу базу данных в виде серии объектов. Вам не нужно писать команды SQL для вставки или извлечения данных, вы используете ряд атрибутов и методов, прикрепленных к объектам.





Это может показаться сложным и ненужным, но они могут сэкономить вам много времени и помочь контролировать доступ к вашей базе данных.

Вот пример. Скажите, что всякий раз, когда вы вставляете пароль в свою базу данных, вы хотите его хешировать, как описано в разделе «Защита паролем веб-сайта». Это не проблема для простых случаев использования - вы выполняете расчет перед вставкой. Но что, если вам нужно вставить запись во многие места кода? Что, если другой программист вставит в вашу таблицу, о чем вы не знаете?



Используя ORM, вы можете написать код, гарантирующий, что всякий раз, когда и где бы ни происходил доступ к какой-либо строке или полю в вашей базе данных, в первую очередь выполнялся ваш другой настраиваемый код.

Это также действует как «единственный источник истины». Если вы хотите изменить пользовательский расчет, вам нужно изменить его только в одном месте, а не в нескольких. Многие из этих принципов можно реализовать с помощью объектно-ориентированное программирование (ООП) на Python , но ORM работают в тандеме с принципами ООП для управления доступом к базе данных.





Есть определенные вещи, на которые следует обратить внимание при использовании ORM, и есть обстоятельства, при которых вы можете не захотеть его использовать, но они обычно считаются полезными, особенно в большой кодовой базе.

ORM в Python с использованием SQLAlchemy

Как и многие задачи в Python, быстрее и проще импортировать модуль, чем писать свой собственный. Конечно, можно написать собственный ORM, но зачем изобретать велосипед?





Все следующие примеры используют SQLAlchemy , популярный Python ORM, но многие принципы применимы независимо от реализации.

Настройка Python для SQLAlchemy

Прежде чем приступить к работе, вам нужно будет настроить свой компьютер для разработки Python с помощью SQLAlchemy.

Вам нужно будет использовать Python 3.6, чтобы следовать этим примерам. Хотя старые версии будут работать, приведенный ниже код потребует некоторых изменений перед запуском. Не уверены в различиях? В нашем FAQ по Python описаны все различия.

Перед кодированием вы должны настроить среду Python, которая предотвратит проблемы с другими импортированными пакетами Python.

Убедитесь, что у вас есть PIP, менеджер пакетов Python установлен, который поставляется с большинством современных версий Python.

Когда вы будете готовы к работе, вы можете начать с подготовки SQLAlchemy. Из среды Python в командной строке установите SQLAlchemy с pip install команда:

pip install SQLAlchemy-1.2.9

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

Теперь вы готовы начать кодирование. Возможно, вам потребуется подготовить базу данных для приема соединения Python, но все следующие примеры используют SQLite база данных, созданная в памяти ниже.

Модели в SQLAlchemy

Одним из ключевых компонентов ORM является модель . Это класс Python, который описывает, как должна выглядеть таблица и как она должна работать. Это версия ORM СОЗДАТЬ ТАБЛИЦУ оператор в SQL. Вам нужна модель для каждой таблицы в вашей базе данных.

Откройте свой любимый текстовый редактор или IDE и создайте новый файл с именем test.py . Введите этот стартовый код, сохраните файл и запустите его:

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
engine = create_engine('sqlite://') # Create the database in memory
Base.metadata.create_all(engine) # Create all the tables in the database

Этот код выполняет несколько функций. Импорт необходим, чтобы Python понимал, где найти необходимые ему модули SQLAlchemy. Ваши модели будут использовать декларативная_база позже, и он настраивает все новые модели для работы должным образом.

В create_engine создает новое соединение с вашей базой данных. Если у вас уже есть база данных, вам нужно изменить sqlite: // к URI вашей базы данных. Как бы то ни было, этот код создаст новую базу данных только в памяти. База данных уничтожается после завершения выполнения вашего кода.

Наконец, create_all создает все таблицы, определенные в ваших режимах, в вашей базе данных. Поскольку вы еще не определили никаких моделей, ничего не произойдет. Запустите этот код, чтобы убедиться, что у вас нет проблем или опечаток.

Сделаем модель. Добавьте еще один импорт в начало файла:

from sqlalchemy import Column, Integer, String

Это импортирует Столбец , Целое число , а также Нить модули из SQLAlchemy. Они определяют, как работают таблицы, поля, столбцы и типы данных базы данных.

Под декларативная_база , создайте свой класс модели:

class Cars(Base):
__tablename__ = 'cars'
id = Column(Integer, primary_key=True)
make = Column(String(50), nullable=False)
color = Column(String(50), nullable=False)

В этом простом примере используются автомобили, но ваши таблицы могут содержать любые данные.

Каждый класс должен наследовать База . Имя вашей таблицы базы данных определено в __tablename__ . Оно должно совпадать с именем класса, но это всего лишь рекомендация, и ничего не сломается, если они не совпадают.

Наконец, каждый столбец определяется как переменная Python в классе. Используются разные типы данных, и основной ключ атрибут сообщает SQLAlchemy создать я бы столбец в качестве первичного ключа.

Продолжайте и добавьте последний импорт, на этот раз для Внешний ключ модуль. Добавьте это вместе со своим Столбец Импортировать:

from sqlalchemy import Column, ForeignKey, Integer, String

Теперь создайте второй класс модели. Этот класс называется Автовладельцы , и хранит информацию о владельце конкретных автомобилей, хранящуюся в Машины стол:

class CarOwners(Base):
__tablename__ = 'carowners'
id = Column(Integer, primary_key=True)
name = Column(String(50), nullable=False)
age = Column(Integer, nullable=False)
car_id = Column(Integer, ForeignKey('cars.id'))
car = relationship(Cars)

Здесь введено несколько новых атрибутов. В car_id поле определяется как внешний ключ. Он связан с я бы в машины стол. Обратите внимание, как используется имя таблицы в нижнем регистре вместо имени класса в верхнем регистре.

Наконец, атрибут автомобиль определяется как отношение . Это позволяет вашей модели получить доступ к Машины table через эту переменную. Это показано ниже.

Если вы запустите этот код сейчас, вы увидите, что ничего не происходит. Это потому, что вы еще не сказали ему делать что-нибудь заметное.

Объекты в SQLAlchemy

Теперь, когда ваши модели созданы, вы можете начать получать доступ к объектам, а также читать и записывать данные. Хорошая идея - поместить вашу логику в отдельный класс и файл, но пока она может оставаться рядом с моделями.

Запись данных

В этом примере вам нужно вставить некоторые данные в базу данных, прежде чем вы сможете их прочитать. Если вы используете существующую базу данных, возможно, у вас уже есть данные. В любом случае, очень полезно знать, как вставлять данные.

Вы, возможно, привыкли писать ВСТАВЛЯТЬ операторы в SQL. SQLAlchemy сделает это за вас. Вот как вставить одну строку в Машины модель. Начните с нового импорта для создатель сессий :

from sqlalchemy.orm import sessionmaker

Это необходимо для создания сессия а также DBSession объекты, которые используются для чтения и записи данных:

DBSession = sessionmaker(bind=engine)
session = DBSession()

Теперь поместите это под свой create_all утверждение:

car1 = Cars(
make='Ford',
color='silver'
)
session.add(car1)
session.commit()

Давайте разберем этот код. Переменная автомобиль1 определяется как объект на основе Машины модель. Его марка и цвет задаются в качестве параметров. Это все равно, что сказать «сделай мне машину, но пока не записывай ее в базу данных». Этот автомобиль существует в памяти, но ожидает записи.

Добавить машину в сеанс с помощью session.add , а затем записать его в базу данных с помощью session.commit .

Теперь добавим владельца:

owner1 = CarOwners(
name='Joe',
age='99',
car_id=(car1.id)
)
session.add(owner1)
session.commit()

Этот код почти идентичен предыдущей вставке для Машины модель. Главное отличие здесь в том, что car_id является внешним ключом, поэтому необходим идентификатор строки, который существует в другой таблице. Доступ к нему осуществляется через car1.id имущество.

Вам не нужно запрашивать базу данных или возвращать какие-либо идентификаторы, поскольку SQLAlchemy обрабатывает это за вас (если вы сначала фиксируете данные).

Чтение данных

После того, как вы записали некоторые данные, вы можете начать их считывать. Вот как запросить Машины а также Автовладельцы таблицы:

result = session.query(Cars).all()

Это так просто. Используя запрос метод найден в сессия , вы указываете модель, а затем используете все для получения всех результатов. Если вы знаете, что будет только один результат, вы можете использовать первый метод:

result = session.query(Cars).first()

После того, как вы запросили модель и сохранили возвращенные результаты в переменной, вы можете получить доступ к данным через объект:

print(result[0].color)

Будет напечатан цвет «серебро», так как эта запись является первой строкой. Вы можете перебрать объект результата, если хотите.

Как вы определили связь в своей модели, можно получить доступ к данным в связанных таблицах без указания соединения:

result = session.query(CarOwners).all()
print(result[0].name)
print(result[0].car.color)

Это работает, потому что ваша модель содержит детали вашей структуры таблицы, а автомобиль атрибут был определен как ссылка на машины стол.

Что не нравится в ORM?

В этом руководстве рассматриваются только самые основы, но как только вы освоите их, вы можете переходить к более сложным темам. У ORM есть несколько потенциальных недостатков:

  • Вы должны написать свою модель перед запуском любых запросов.
  • Это еще один новый синтаксис, который нужно изучить.
  • Это может быть слишком сложно для простых нужд.
  • Для начала у вас должен быть хороший дизайн базы данных.

Эти проблемы сами по себе не являются большой проблемой, но их стоит остерегаться. Если вы работаете с существующей базой данных, вас могут поймать.

Если вы не уверены, что ORM - то, что вам нужно, обязательно прочтите о важные команды SQL, которые должны знать программисты .

Делиться Делиться Твитнуть Эл. адрес Следует ли вам немедленно перейти на Windows 11?

Скоро выйдет Windows 11, но стоит ли обновиться как можно скорее или подождать несколько недель? Давайте разберемся.

Читать далее
Похожие темы
  • Программирование
  • Python
  • SQL
  • Учебники по кодированию
Об авторе Джо Кобурн(136 опубликованных статей)

Джо закончил факультет компьютерных наук Линкольнского университета в Великобритании. Он профессиональный разработчик программного обеспечения, и когда он не пилотирует дроны и не пишет музыку, его часто можно встретить фотографирующим или снимающим видео.

дешевые места для ремонта экрана телефона
Ещё от Joe Coburn

Подписывайтесь на нашу новостную рассылку

Подпишитесь на нашу рассылку технических советов, обзоров, бесплатных электронных книг и эксклюзивных предложений!

Нажмите здесь, чтобы подписаться