2009-09-09 59 views
6

我的工作已經使用sqlalchemy.ext.declarative實施了相當大的代碼庫,我需要一個類似字典的屬性添加到類之一。我需要的是與this question相同,但以聲明方式。有更多SQLAlchemy知識的人能給我一個例子嗎? 在此先感謝...聲明式SQLAlchemy中的標記詞典?

+0

如果你不需要查詢屬性,那麼這個答案提供了一種替代方法:http://stackoverflow.com/questions/1378325/python-dicts-in-sqlalchemy/1378818#1378818 – 2009-09-09 18:45:48

回答

13

聲明是確定的事情的另一種方式。事實上,如果你使用分離的映射,你會得到完全相同的環境。

因爲我回答了另一個問題,我會嘗試這一個也。希望它讓更多upvotes;)

嗯,首先我們定義的類

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 

我得到:

​​

現在,讓我們檢查筆記表...

for note in s.query(Note): 
    print note.id_item, note.name, note.value 

我得到:

1 color orange 
1 data none 
1 size big 

它的作品! :D

+0

謝謝@nosklo! – 2009-09-10 10:01:42

+0

我得到一個'sqlalchemy.exceptions.NoReferencedTableError:找不到表「項目」,用以生成異物key' – 2009-09-10 11:17:12

+0

定了!不得不從'Note.id_item'除去'ForeignKey的( 'items.id')'和添加'注意.__表__。append_constraint(ForeignKeyConstraint([ 'id_item'],[ 'items.id']))'的聲明之後'Item'。還必須用'Item._notesdict'中的'Note .__ table __.c.name'替換'Note.name'。 – 2009-09-10 16:10:45