2015-01-09 32 views
0

我使用聲明式樣式用SQLAlchemy定義我的表格。如何從SqlAlchemy的聲明表中獲取列引用?

Base = declarative_base() 

class MyTable(Base): 
    id = Column('someone_put_a_strange_for_id', Integer) 

現在,當我定義的ForeignKey 類,我需要使用

MyTable.__table__.c.someone_put_a_strange_for_id 

指這種ID欄屬性。有沒有什麼辦法可以使用

MyTable.id.some_magic 

得到這個Column屬性?

+0

爲什麼不直接使用參考模型(而不是列):'ForeignKey的(MyTable.id)' ? – van

+0

我試過了,它不起作用。因爲屬性名稱與表格字段名稱不同。 – davidshen84

+0

奇怪的是,這是Mike在答案中提到的第一個簡單選項,它對我來說一直很有用。希望Mike的答案中列出的其他選項將幫助你。 – van

回答

1

這裏有兩個簡單的選項。

最簡單的是,只是指類的屬性!

Base = declarative_base() 

class MyTable(Base): 
    __tablename__ = 'mt' 
    id = Column('someone_put_a_strange_for_id', Integer, primary_key=True) 
    bar = Column(Integer) 

fk = ForeignKeyConstraint(['bar'], [MyTable.id]) 

這實際上不是Column對象,但在幾乎所有情況下,SQLAlchemy的會看看這個對象稱爲__clause_element__()一個特殊的屬性,這將拉出實際Column。在現代的SQLAlchemy版本中,這應該可以在任何地方工作,如果有某個地方不起作用,則發佈錯誤報告。

另一種是把一個。關鍵在列:

class MyTable(Base): 
    id = Column('someone_put_a_strange_for_id', Integer, key='id') 

以上,該列現在table.c.id在所有的Python的情況下,「名」是僅在SQL側。所以如果你直接和table.c打交道,那你就去。

還有更多選擇!這是你的類映射器也有自己的.c屬性,你可以得到這樣的看法也:

from sqlalchemy import inspect 

Base = declarative_base() 

class MyTable(Base): 
    __tablename__ = 'mt' 
    id = Column('someone_put_a_strange_for_id', Integer, primary_key=True) 

inspect(MyTable).c.id 
+0

謝謝,我會試一試。 – davidshen84

相關問題