似乎您可以直接使用属性,而不是使用columnsdict。
考虑以下设置:from sqlalchemy import Table, Column, Integer, Unicode, MetaData, create_engine
from sqlalchemy.orm import mapper, create_session
class Word(object):
pass
wordColumns = ['english', 'korean', 'romanian']
e = create_engine('sqlite://')
metadata = MetaData(bind=e)
t = Table('words', metadata, Column('id', Integer, primary_key=True),
*(Column(wordCol, Unicode(255)) for wordCol in wordColumns))
metadata.create_all()
mapper(Word, t)
session = create_session(bind=e, autocommit=False, autoflush=True)
有了这个空类,您可以:w = Word()
w.english = u'name'
w.korean = u'이름'
w.romanian = u'nume'
session.add(w)
session.commit()
当您想访问数据时:w = session.query(Word).filter_by(english=u'name').one()
print w.romanian
这是整个sqlalchemy的ORM点,而不是使用tuple或dict来访问数据,而是在自己的类上使用属性,如访问。
所以我想知道你为什么要使用dict。也许是因为你用字符串表示语言名。因此,可以使用python的getattr和setattr代替,就像在任何python对象上一样:language = 'korean'
print getattr(w, language)
这应该能解决你所有的问题。
也就是说,如果您仍然想使用类似于dict的对列的访问,那么这也是可能的。你只需要实现一个类似dict的对象。现在我将提供代码来实现这一点,尽管我认为这绝对是不必要的混乱,因为属性访问非常干净。如果使用上面的方法已经解决了问题,不要使用下面的代码。
您可以在Word类上执行此操作:class Word(object):
def __getitem__(self, item):
return getattr(self, item)
def __setitem__(self, item, value):
return setattr(self, item, value)
其余的设置如上所述。你可以这样使用它:w = Word()
w['english'] = u'name'
如果您想要一个columns属性,那么您需要一个类似dict的class AttributeDict(DictMixin):
def __init__(self, obj):
self._obj = obj
def __getitem__(self, item):
return getattr(self._obj, item)
def __setitem__(self, item, value):
return setattr(self._obj, item, value)
class Word(object):
def __init__(self):
self.columns = AttributeDict(self)
然后你可以随心所欲地使用:w = Word()
w.columns['english'] = u'name'
我想你会同意这一切都是不必要的复杂,没有额外的好处。