我有以下問題:SQLAlchemy的動態映射
我有類:
class Word(object):
def __init__(self):
self.id = None
self.columns = {}
def __str__(self):
return "(%s, %s)" % (str(self.id), str(self.columns))
self.columns是將保持一個字典(COLUMNNAME:columnValue)值。列的名稱在運行時是已知的,它們被裝在一個wordColumns列表,例如
wordColumns = ['english', 'korean', 'romanian']
wordTable = Table('word', metadata,
Column('id', Integer, primary_key = True)
)
for columnName in wordColumns:
wordTable.append_column(Column(columnName, String(255), nullable = False))
我甚至創建的「力」的表列上的字被映射一個明確的映射屬性。列[列名],而不是word.columnName,我沒有得到映射的任何錯誤,但似乎不起作用。
mapperProperties = {}
for column in wordColumns:
mapperProperties['columns[\'%']' % column] = wordTable.columns[column]
mapper(Word, wordTable, mapperProperties)
當我裝入一個字對象,SQLAlchemy的創建其具有word.columns [「英語」],word.columns [「韓語」]等性質而不是將它們加載到word.columns的字典對象。所以對於每一列,它創建一個新的屬性。此外word.columns字典甚至不存在。
同樣,當我嘗試堅持一個單詞時,SQLAlchemy希望在名爲like word.columns ['english'](string type)的屬性中找到列值 ,而不是字典word.columns。
我不得不說,我與Python和SQLAlchemy的經驗是相當有限的,也許這是不可能做什麼,我試圖做的。
任何幫助讚賞,
在此先感謝。
感謝您抽出時間來寫這樣一個完整的答案。我同意第一個解決方案比第二個解決方案更乾淨更優雅。我沒有任何好的理由使用的字典,除了一個事實,這是它排在我的腦海裏「正常」的事情。就像我之前說的,我在Python一種新的,我還沒有學到尚未採取的動態語言的優勢。我會用你的第一個解決方案。再次感謝:) – 2010-04-04 18:37:36
我不能克服很多這樣的帖子怎麼會在這裏的存在,但我仍然敬畏,當我看到一個。感謝您爲此付出瞭如此多的考慮。一年之後對新人們仍然有幫助。歡呼聲 – Profane 2011-06-20 22:27:48
現在,如果我想用kwargs來啓動Word,如w = Word(英文='name',korean ='Phoo',romanian ='nume'),那麼這將如何工作?在我的情況下,它會繼續拋出__init__錯誤。謝謝! – Julius 2016-01-25 23:02:51