SQLAlchemy,反射,不同的后端和表/列不区分大小写

时间:2012-02-21 19:26:44

标签: sqlite postgresql reflection sqlalchemy

简介:我正在使用支持多个数据库的SQLAlchemy反射编写Web界面。事实证明,应用程序的作者使用小写表/列定义了postgresql,例如。 job.jobstatus ,而sqlite有大小写混合,例如 Job.JobStatus 。我正在使用示例中的 DeclarativeReflectedBase 来组合反射和声明式样式。

问题:将SQLAlchemy配置为使用反射不区分大小写的表/列

我到目前为止已做过:

  • 我更改了 DeclarativeReflectedBase.prepare()方法,将 quote = False 传递到表.__ init __

还有待解决的问题:

  • 关系定义在配置连接时仍然必须遵守,例如 primaryjoin =“Job.JobStatus == Status.JobStatus”
  • 根据引擎类型配置__tablename__

问题:我的假设是正确的还是更直接的方式? 也许我可以告诉反思,以反映所有小写,所有问题都消失了。

1 个答案:

答案 0 :(得分: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)

我认为这可能会涵盖它。