简介:我正在使用支持多个数据库的 SQLAlchemy 反射编写 Web 界面。事实证明,应用程序的作者使用小写表/列定义了 postgresql,例如。 job.jobstatus 而 sqlite 有大小写混合,例如 Job.JobStatus。我正在使用示例中的 DeclarativeReflectedBase 来结合反射和声明式风格。
问题:配置 SQLAlchemy 以使用反射不区分大小写的表/列
到目前为止我做了:
- 我更改了 DeclarativeReflectedBase.prepare() 方法以将 quote=False 传递到 Table.__init__
还有待解决的问题:
- 在配置联接时,关系定义仍然必须遵守大小写,例如 primaryjoin="Job.JobStatus==Status.JobStatus"。
- 根据引擎类型配置__tablename__
问题:我的假设是正确的还是有更直接的方法? 也许我可以告诉反射来反射(reflect)所有小写字母,所有问题都消失了。
最佳答案
您可能希望在每个小写的列上定义一个“.key”,这样您就可以在应用程序代码中将列引用为小写。您应该使用 column_reflect 事件(参见 http://docs.sqlalchemy.org/en/latest/core/events.html#schema-events)将此键定义为 .name 的小写版本。
然后,当你反射(reflect)表格时,我会做这样的事情:
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)
我认为这可能涵盖它。
关于sqlite - SQLAlchemy、反射、不同的后端和表/列不区分大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9383837/