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

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

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

Что такое ОРМ?

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

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

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

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

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

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

, но ORM работают в тандеме с принципами ООП для контроля доступа к базе данных.

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

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

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

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

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

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

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

охватывает все различия.

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

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

Убедитесь, что у вас есть PIP, менеджер пакетов Python

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

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

pip install SQLAlchemy-1.2.9

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

Установка SQLAlchemy на вашем ПК

Теперь вы готовы начать кодирование. Возможно, вам придется подготовить базу данных для приема соединения 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. Ваши модели будут использовать declarative_base позже, и это настраивает любые новые модели для работы, как ожидалось.

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

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

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

from sqlalchemy import Column, Integer, String

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

Под declarative_base, создайте свой модельный класс:

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

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

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 поле определяется как внешний ключ. Это связано с Я бы в машины Таблица. Обратите внимание, как используется имя таблицы в нижнем регистре, вместо имени класса в верхнем регистре.

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

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

Объекты в SQLAlchemy

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

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

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

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

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()

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

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

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

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

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

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

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

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

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

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

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

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

print(result[0].color)

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

Пример запроса Python-ORM

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

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

Простой запрос к базе данных с использованием ORM

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

Что не нравится в ОРМ?

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

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

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

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

,

Ссылка на основную публикацию
Adblock
detector