Mysql 重用现有ORM映射时sqlalchemy中特定于方言的表名和列名

Mysql 重用现有ORM映射时sqlalchemy中特定于方言的表名和列名,mysql,postgresql,sqlalchemy,confluence,Mysql,Postgresql,Sqlalchemy,Confluence,我使用sqlalchemy的ORM库与我们应用程序的一个数据库进行接口。在一台主机上,应用程序实例的数据库后端是PostgreSQL,而在另一台主机上,出于历史原因,我们使用MySQL 模式(和关系)在两个后端都是相同的,但是PostgreSQL中的表名和列名是小写的,而在MySQL中是大写的。在sqlalchemy中有什么方法可以调整我的模式,这样我就不需要重复代码了吗 下面是我的模式示例。提示,应用程序是一个汇流wiki;) 从sqlalchemy导入( 大整数, 专栏, 日期时间, 一串

我使用
sqlalchemy
的ORM库与我们应用程序的一个数据库进行接口。在一台主机上,应用程序实例的数据库后端是PostgreSQL,而在另一台主机上,出于历史原因,我们使用MySQL

模式(和关系)在两个后端都是相同的,但是PostgreSQL中的表名和列名是小写的,而在MySQL中是大写的。在
sqlalchemy
中有什么方法可以调整我的模式,这样我就不需要重复代码了吗

下面是我的模式示例。提示,应用程序是一个汇流wiki;)

从sqlalchemy导入(
大整数,
专栏,
日期时间,
一串
)
从sqlalchemy.ext.declarative导入声明性基础
Base=声明性_Base()
类空间(基):
__tablename_uu='spaces'
spaceid=列(BigInteger,主键=True)
spacename=列(字符串(255))
spacekey=Column(字符串(255),null=False,unique=True)
lowerspacekey=Column(字符串(255),null=False,index=True)
spacedescid=Column(BigInteger,index=True)
主页=列(biginger,index=True)
创建者=列(字符串(255),索引=真)
creationdate=列(日期时间,索引=True)
lastmodifier=Column(字符串(255),索引=True)
lastmoddate=列(日期时间)
空格类型=列(字符串(255))
spacestatus=Column(字符串(255),索引=True)

多亏了@rfkortekaas的建议,我通过自动映射模式并随后覆盖表名和列名的命名方案,成功地解决了这个问题

sqlalchemy
的文档有两个非常有用的页面:

为了子孙后代:

来自sqlalchemy导入事件的

从sqlalchemy.ext.automap导入automap_base
from.utilities import to_pascal_case,to_snake_case
AutomapBase=automap_base()
@event.listens_查找(AutomapBase.metadata,“column_reflect”)
def列反映(检查器、表格、列信息):
列信息['key']=到案例(列信息['name'])
def classname_用于_表(基本、表名称、表):
返回到\u pascal\u案例(表\u名称)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
dbcs='postgresql://username:password@127.0.0.1:3306/数据库'
自动映射引擎=创建引擎(dbcs,future=True,echo=verbose>2)
自动制备(
自动加载=自动映射引擎,
类名称\u表示\u表=类名称\u表示\u表,
)
#使用AutomapBase.classes访问自动映射的类。

您能自动加载表格吗?也许这是一个解决办法