我正在编写一个SQLAlchemy应用程序,需要连接到PostgreSQL数据库和MySQL数据库。基本上,我正在从现有的MySQL数据库加载数据,对其进行一些转换,然后将其保存在PostgreSQL中。
我正在使用SQLAlchemy的declarative base
管理PostgreSQL模式。MySQL数据库已经存在,并且我正在通过SqLalchemy的反射访问该模式。两者都有非常不同的模式。
我知道我需要每个数据库的专用engines
,但我不清楚是否需要以下任何专用对象:Base
-我认为这对应于数据库模式。由于两个数据库都有非常不同的模式,我需要为每个模式指定一个Base
。Metadata
-这是一个全局元数据对象,它保存来自所有引擎的所有模式吗?Sessions
-我不确定,但我想每个数据库需要单独的会话?或者一个session
可以共享多个engine
/Base
组合?我正在使用scoped_sessions
。
我的部分困惑来自于不理解Base
和Metadata
之间的区别。SQLAlchemy docs say:
元数据是一个容器对象,它将所描述的数据库(或多个数据库)的许多不同功能放在一起。
这似乎意味着一个metadata
可以容纳多个Base
,但我对它的工作原理还是有点模糊。例如,我希望能够调用metadata.create_all()
并在PostgreSQL中创建表,而不是MySQL。
最佳答案
简而言之,对于这两个数据库来说,最简单的方法是分别拥有它们的实例。可以创建一个routing session,但它有它的注意事项。sessionmaker
和Session
还支持passing multiple binds as an argument和2-phase commits,这也允许对多个数据库使用单个会话。幸运的是,支持两阶段提交的两个数据库是PostgreSQL和MySQL。
关于Base
与metadata
之间的关系:Base
是一个基类,它有一个元类,用于根据类本身及其子类中提供的信息声明性地创建Table
对象。Table
的子类隐式声明的所有Base
对象将共享相同的MetaData
。
在创建新的声明性基时,您可以提供元数据作为参数,从而在多个Base
之间共享它,但在您的情况下,它并不有用。MetaData
是Table
对象及其关联架构构造的集合。它还可以与Engine
或Session
保持绑定。
简而言之,您可以有Table
s和MetaData
而不需要Base
,但是Base
需要MetaData
才能工作。