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

标签 sqlite postgresql reflection sqlalchemy

简介:我正在使用支持多个数据库的 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/

相关文章:

php - 打印 Postgres 数据库数组中的所有行

c# - 检查类的实例是否用属性注释

c# - 如何通过反射将枚举值传递给方法

postgresql - 数据库设计父子表vs多表

postgresql - Kubernetes-持久卷

java - 如何在运行时将 Java Enum 转换为 Json?

python - 如何在 python 中设计一个像 sqlite 类的字典,它可以使用不同的字段作为 "key"?

android - 从 adb shell 使用 sqlite3 时光标键不起作用

php - 多个插入不适用于SQLite 3

ios - 将 SQLCipher 与 MonoTouch 结合使用