我正在编写一个SQLAlchemy应用程序,需要连接到PostgreSQL数据库和MySQL数据库。基本上,我正在从现有的MySQL数据库加载数据,对其进行一些转换,然后将其保存在PostgreSQL中。
我正在使用SQLAlchemy的declarative base管理PostgreSQL模式。MySQL数据库已经存在,并且我正在通过SqLalchemy的反射访问该模式。两者都有非常不同的模式。
我知道我需要每个数据库的专用engines,但我不清楚是否需要以下任何专用对象:
Base-我认为这对应于数据库模式。由于两个数据库都有非常不同的模式,我需要为每个模式指定一个Base
Metadata-这是一个全局元数据对象,它保存来自所有引擎的所有模式吗?
Sessions-我不确定,但我想每个数据库需要单独的会话?或者一个session可以共享多个engine/Base组合?我正在使用scoped_sessions
我的部分困惑来自于不理解BaseMetadata之间的区别。SQLAlchemy docs say
元数据是一个容器对象,它将所描述的数据库(或多个数据库)的许多不同功能放在一起。
这似乎意味着一个metadata可以容纳多个Base,但我对它的工作原理还是有点模糊。例如,我希望能够调用metadata.create_all()并在PostgreSQL中创建表,而不是MySQL。

最佳答案

简而言之,对于这两个数据库来说,最简单的方法是分别拥有它们的实例。可以创建一个routing session,但它有它的注意事项。
sessionmakerSession还支持passing multiple binds as an argument2-phase commits,这也允许对多个数据库使用单个会话。幸运的是,支持两阶段提交的两个数据库是PostgreSQL和MySQL。
关于Basemetadata之间的关系:
Base是一个基类,它有一个元类,用于根据类本身及其子类中提供的信息声明性地创建Table对象。Table的子类隐式声明的所有Base对象将共享相同的MetaData
在创建新的声明性基时,您可以提供元数据作为参数,从而在多个Base之间共享它,但在您的情况下,它并不有用。
MetaData
Table对象及其关联架构构造的集合。它还可以与EngineSession保持绑定。
简而言之,您可以有Tables和MetaData而不需要Base,但是Base需要MetaData才能工作。

09-28 07:55
查看更多