python动态映射_sqlalchemy动态映射
似乎您可以直接使用屬性,而不是使用columnsdict。
考慮以下設(shè)置: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)
有了這個(gè)空類,您可以:w = Word()
w.english = u'name'
w.korean = u'??'
w.romanian = u'nume'
session.add(w)
session.commit()
當(dāng)您想訪問數(shù)據(jù)時(shí):w = session.query(Word).filter_by(english=u'name').one()
print w.romanian
這是整個(gè)sqlalchemy的ORM點(diǎn),而不是使用tuple或dict來訪問數(shù)據(jù),而是在自己的類上使用屬性,如訪問。
所以我想知道你為什么要使用dict。也許是因?yàn)槟阌米址硎菊Z言名。因此,可以使用python的getattr和setattr代替,就像在任何python對(duì)象上一樣:language = 'korean'
print getattr(w, language)
這應(yīng)該能解決你所有的問題。
也就是說,如果您仍然想使用類似于dict的對(duì)列的訪問,那么這也是可能的。你只需要實(shí)現(xiàn)一個(gè)類似dict的對(duì)象。現(xiàn)在我將提供代碼來實(shí)現(xiàn)這一點(diǎn),盡管我認(rèn)為這絕對(duì)是不必要的混亂,因?yàn)閷傩栽L問非常干凈。如果使用上面的方法已經(jīng)解決了問題,不要使用下面的代碼。
您可以在Word類上執(zhí)行此操作:class Word(object):
def __getitem__(self, item):
return getattr(self, item)
def __setitem__(self, item, value):
return setattr(self, item, value)
其余的設(shè)置如上所述。你可以這樣使用它:w = Word()
w['english'] = u'name'
如果您想要一個(gè)columns屬性,那么您需要一個(gè)類似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'
我想你會(huì)同意這一切都是不必要的復(fù)雜,沒有額外的好處。
總結(jié)
以上是生活随笔為你收集整理的python动态映射_sqlalchemy动态映射的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中412是什么错_HTTP 41
- 下一篇: 网管日志-06.07.24