【发布时间】:2011-01-19 23:12:27
【问题描述】:
我是 SQLAlchemy 和关系数据库的新手,我正在尝试为带注释的词典建立一个模型。我想为可以在运行时添加或删除的单词支持任意数量的键值注释。由于键名会有很多重复,我不想直接用this solution,虽然代码差不多。
我的设计有单词对象和属性对象。单词和属性存储在单独的表中,其中包含链接两者的 property_values 表。代码如下:
from sqlalchemy import Column, Integer, String, Table, create_engine
from sqlalchemy import MetaData, ForeignKey
from sqlalchemy.orm import relation, mapper, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine('sqlite:///test.db', echo=True)
meta = MetaData(bind=engine)
property_values = Table('property_values', meta,
Column('word_id', Integer, ForeignKey('words.id')),
Column('property_id', Integer, ForeignKey('properties.id')),
Column('value', String(20))
)
words = Table('words', meta,
Column('id', Integer, primary_key=True),
Column('name', String(20)),
Column('freq', Integer)
)
properties = Table('properties', meta,
Column('id', Integer, primary_key=True),
Column('name', String(20), nullable=False, unique=True)
)
meta.create_all()
class Word(object):
def __init__(self, name, freq=1):
self.name = name
self.freq = freq
class Property(object):
def __init__(self, name):
self.name = name
mapper(Property, properties)
现在我希望能够做到以下几点:
Session = sessionmaker(bind=engine)
s = Session()
word = Word('foo', 42)
word['bar'] = 'yes' # or word.bar = 'yes' ?
s.add(word)
s.commit()
理想情况下,这应该将 1|foo|42 添加到 words 表,将 1|bar 添加到 properties 表,并将 1|1|yes 添加到 property_values 表。但是,我没有正确的映射和关系来实现这一点。我从http://www.sqlalchemy.org/docs/05/mappers.html#association-pattern 的文档中了解到我想在这里使用关联代理或类似的东西,但是我不清楚语法。我对此进行了实验:
mapper(Word, words, properties={
'properties': relation(Property, secondary=property_values)
})
但是这个映射器只填写外键值,我还需要填写其他值。任何帮助将不胜感激。
【问题讨论】:
标签: python orm sqlalchemy