を使用して実装された非常に大きなコードベースに取り組んでおりsqlalchemy.ext.declarative
、クラスの1つにdictのようなプロパティを追加する必要があります。私が必要としているのはこの質問と同じですが、宣言型です。SQLAlchemyの知識が豊富な人に例を教えてもらえますか?前もって感謝します...
1779 次
1 に答える
14
宣言型は、物事を定義するもう1つの方法です。実質的には、個別のマッピングを使用した場合とまったく同じ環境になります。
もう一つの質問に答えたので、これもやってみます。それがより多くの賛成票を与えることを願っています;)
まず、クラスを定義します
from sqlalchemy import Column, Integer, String, Table, create_engine
from sqlalchemy import orm, MetaData, Column, ForeignKey
from sqlalchemy.orm import relation, mapper, sessionmaker
from sqlalchemy.orm.collections import column_mapped_collection
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine('sqlite:///:memory:', echo=True)
Base = declarative_base(bind=engine)
class Note(Base):
__tablename__ = 'notes'
id_item = Column(Integer, ForeignKey('items.id'), primary_key=True)
name = Column(String(20), primary_key=True)
value = Column(String(100))
def __init__(self, name, value):
self.name = name
self.value = value
class Item(Base):
__tablename__ = 'items'
id = Column(Integer, primary_key=True)
name = Column(String(20))
description = Column(String(100))
_notesdict = relation(Note,
collection_class=column_mapped_collection(Note.name))
notes = association_proxy('_notesdict', 'value', creator=Note)
def __init__(self, name, description=''):
self.name = name
self.description = description
Base.metadata.create_all()
それでは、テストを行いましょう。
Session = sessionmaker(bind=engine)
s = Session()
i = Item('ball', 'A round full ball')
i.notes['color'] = 'orange'
i.notes['size'] = 'big'
i.notes['data'] = 'none'
s.add(i)
s.commit()
print i.notes
私は得る:
{u'color': u'orange', u'data': u'none', u'size': u'big'}
それでは、メモの表を確認しましょう...
for note in s.query(Note):
print note.id_item, note.name, note.value
私は得る:
1 color orange
1 data none
1 size big
できます!!:D
于 2009-09-09T17:04:33.537 に答える