私は最近、Pylons を使っていくつかの作業を行っていますが、データベースの相互作用のための SQLAlchemy モデルが非常に気に入っています。私の Web サイトには、EAV スキーマの恩恵を受けると思われるセクションが 1 つあります。
これを私のテーブルの例として使用します:
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 スキーマでも同じことができるようにしたいと考えています。data.age
したがって、基本的には、SQLAlchemy を拡張して、それを実際に呼び出すと、 が必要であることを伝える方法が必要ですSELECT value FROM table WHERE id=1 AND type='age'
。
これは実行可能ですか?または、手動で発行されたクエリでコードを乱雑にする必要がありますか?