关于python:声明式SQLAlchemy中的标签词典?

Dictionary of tags in declarative SQLAlchemy?

我正在处理使用sqlalchemy.ext.declarative实现的相当大的代码基,我需要向其中一个类添加类似dict的属性。我需要的和这个问题中的一样,但是以声明的方式。有人能给我举个例子吗?事先谢谢…


声明性只是定义事物的另一种方式。实际上,与使用单独的映射相比,最终得到的环境完全相同。

既然我回答了另一个问题,我也试试这个。希望它能给予更多的赞成票;)

首先我们定义类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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()

现在让我们做一个测试:

1
2
3
4
5
6
7
8
9
10
11
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

我得到:

1
{u'color': u'orange', u'data': u'none', u'size': u'big'}

现在让我们检查一下笔记表…

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

我得到:

1
2
3
1 color orange
1 data none
1 size big

它起作用了!!D