2011-06-29 49 views
0

我有一個表TS_TEST_ID列。我有一個具有以下屬性SQLAlchemy的模型:SQLAlchemy - 使用數據庫列名稱在模型中設置值,而不是屬性名稱

id = Column(u'TS_TEST_ID', INTEGER(), primary_key=True, nullable=False) 

有什麼辦法來設置我的模型類的實例idTS_TEST_ID知道什麼時候?也就是說,我只知道數據庫中列的名稱,我想以某種方式將其映射到id並在我的模型上設置id屬性。我希望只是做MyModel(**{'TS_TEST_ID':1})會的工作,但我得到了以下錯誤:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<string>", line 4, in __init__ 
    File "C:\Python26\lib\site-packages\sqlalchemy\orm\state.py", line 111, 
    in initialize_instance 
    return manager.events.original_init(*mixed[1:], **kwargs) 
    File "C:\Python26\lib\site-packages\sqlalchemy\ext\declarative.py", line 1377, 
    in _declarative_constructor 
    (k, cls_.__name__)) 
TypeError: 'TS_TEST_ID' is an invalid keyword argument for MyModel 

我寧可不要在我的模型來定義TS_TEST_ID = Column(u'TS_TEST_ID', INTEGER(), primary_key=True, nullable=False)每列,或者說,甚至叫TS_TEST_ID的方法,它返回id屬性。

+1

無法檢查它,所以只是一個瘋狂的猜測:'yourobj.c.TS_TEST_ID = 15'做的伎倆? –

+0

「MyModel」的一個實例沒有'c'屬性,但我可以通過'myobj .__ mapper __。c'訪問同樣的東西(我想),並試圖訪問'myobj .__ mapper __。c.TS_TEST_ID'使用'AttributeError'失敗。 –

回答

0

這似乎比它需要更復雜,但它的工作原理。我希望有這樣做的更直接的方式......

@staticmethod 
def fromFieldHash(h): 
    row = MyModel() 
    cols = list(row.__table__._columns) 
    for k, v in h.iteritems(): 
     col = find(lambda c: c.key == k, cols) 
     # See http://www.sqlalchemy.org/trac/wiki/06Migration#AnImportantExpressionLanguageGotcha 
     if col is not None: 
      prop = row.__mapper__._columntoproperty[col].key 
      setattr(row, prop, v) 
    return row 

find方法,我使用的是從Cleanest Python find-in-list function

相關問題