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