2012-02-21 21 views
0

簡介:我正在用支持多個數據庫的SQLAlchemy反射編寫web界面。事實證明,應用程序的作者用小寫表格/列定義postgresql,例如。 job.jobstatus while sqlite has mixed case,例如Job.JobStatus。我使用示例中的DeclarativeReflectedBase來組合反射和聲明式樣式。SQLAlchemy,反射,不同的後端和表/列不區分大小寫

問題:

  • 我已經改變DeclarativeReflectedBase.prepare()方法: SQLAlchemy的配置與表/列的情況下與反思

    到目前爲止,我已經做的工作​​不敏感將報價=假納入表.__ init__

那還剩下什麼需要解決:

  • 關係的定義仍然要遵守的情況下配置時加入,如primaryjoin = 「Job.JobStatus == Status.JobStatus」
  • 配置__tablename__根據發動機類型

問題:是我的假設是否正確或是否有更簡單的方法? 也許我可以告訴反射以反映小寫字母,所有問題都消失了。

回答

1

您可能想要考慮在每個列上使用小寫字母來定義「.key」,這樣您可以在應用程序代碼中將列引用爲小寫字母。您應該使用column_reflect事件(請參閱http://docs.sqlalchemy.org/en/latest/core/events.html#schema-events)將此鍵定義爲.name的小寫版本。

那麼,當你反映的表,我只希望做這樣的事情:

def reflect_table(name, engine): 
    if engine.dialect.name == 'postgresql': 
     name = name.lower() 
    return Table(name, autoload=True, autoload_with=engine) 

my_table = reflect_table("MyTable", engine) 

我認爲這可能覆蓋它。

+0

謝謝!我將開始挖掘。 – iElectric 2012-02-21 19:48:36

+0

我最終這樣做:https://gist.github.com/1878559 – iElectric 2012-02-21 20:06:58

+0

你不想在保存sqlite數據庫的時候保存這個案例嗎? – zzzeek 2012-02-21 20:49:03