Недавно я работал с Pylons и очень похож на модель SQLAlchemy для взаимодействия с базой данных.Хотя есть один раздел моего веб-сайта, который, я думаю, мог бы выиграть от схемы EAV.
Используя это в качестве примера моей таблицы:
id | userid | type | value
---+--------+--------|------------
1 | 1 | phone | 111 111 111
---+--------+--------|------------
2 | 1 | age | 40
Я могу вручную выполнить запросы, подобные приведенным ниже, для извлечения иобновить данные:
SELECT value FROM table WHERE userid=1 AND type='phone'
UPDATE table SET value=41 WHERE userid=1 AND type='age'
Это просто и работает ... Но создание запросов вручную не является моим предпочтительным подходом.Я хочу использовать SQLAlchemy для создания моей табличной модели и позволить ей выполнять всю работу по ногам.
Если бы я использовал стандартную схему, где у каждого type
был свой собственный столбец, я мог бы сделать следующее:
class People(Base):
__tablename__ = 'people'
id = Column(Integer, primary_key=True)
userid = Column(Integer, ForeignKey('users.id'))
phone = Column(Unicode(40))
age = Column(Integer)
Затем я мог бы извлечь данные, используя:
data = Session.query(People).filter_by(id=1).first()
print data.age
Я хочу сделать то же самое для моей схемы EAV.В общем, мне нужен способ расширить SQLAlchemy и сказать ему, что когда я вызываю data.age
, это фактически означает, что я хочу SELECT value FROM table WHERE id=1 AND type='age'
.
Это выполнимо?Или я буду вынужден загромождать свой код запросами, выданными вручную?