Вопрос проверяет понимание гибридных и вычисляемых атрибутов в SQLAlchemy для автоматического формирования полей на основе других данных.
Гибридные свойства (hybrid properties) — это механизм SQLAlchemy, который позволяет определять атрибуты модели, вычисляемые на основе других полей. Они ведут себя как обычные атрибуты Python, но при этом могут участвовать в SQL-запросах на уровне базы данных. Это полезно, когда нужно автоматически формировать поле (например, полное имя из имени и фамилии) без дублирования данных.
Гибридное свойство определяется с помощью декоратора @hybrid_property из модуля sqlalchemy.ext.hybrid. Оно может иметь геттер, сеттер и даже отдельное выражение для использования в запросах. В отличие от computed columns в БД, гибридные свойства не хранятся в таблице, а вычисляются при обращении.
from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.ext.hybrid import hybrid_property
from sqlalchemy.orm import sessionmaker
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
first_name = Column(String)
last_name = Column(String)
@hybrid_property
def full_name(self):
return f"{self.first_name} {self.last_name}"
@full_name.expression
def full_name(cls):
return cls.first_name + " " + cls.last_name
# Использование
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
user = User(first_name="John", last_name="Doe")
session.add(user)
session.commit()
print(user.full_name) # John Doe
# Запрос с фильтрацией по гибридному свойству
result = session.query(User).filter(User.full_name == "John Doe").first()
print(result) # Гибридные свойства — это мощный инструмент для создания вычисляемых полей в SQLAlchemy, который сочетает удобство Python-атрибутов с возможностью использования в запросах. Их стоит применять, когда нужно избежать дублирования данных и сохранить гибкость ORM.