简介:我正在用SQLAlchemy反射编写支持多个数据库的web界面。事实证明,应用程序的作者用小写的表/列定义了postgresql,例如job.jobstatus,而sqlite则有混合大小写,例如job.jobstatus.我使用示例中的DeclarativeReflectedBase来组合反射和声明风格。
问题:将SQLAlchemy配置为使用反射处理不区分大小写的表/列
到目前为止我已经完成了:
- 我已经更改了DeclarativeReflectedBase.prepare()方法,将quote=False传递到表中__初始化__
还有什么需要解决:
- 配置联接时,关系定义仍然必须遵守大小写,如primaryjoin="Job.JobStatus==Status.JobStatus"
- 根据引擎类型配置__tablename__
问题:我的假设是正确的还是有更直接的方法也许我可以告诉反射来反映所有小写的东西,所有的问题都消失了。
您可能想研究在每个小写的列上定义一个".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)
我认为这可能涵盖了它。