连接到多个数据库时,是否需要多个SQLAlchemy元数据,基础或会话对象?

时间:2016-03-31 20:04:28

标签: python mysql postgresql sqlalchemy

我正在编写一个需要连接到PostgreSQL数据库和MySQL数据库的SQLAlchemy应用程序。基本上我是从现有MySQL数据库加载数据,对其进行一些转换,然后将其保存在PostgreSQL中。

我正在使用SQLAlchemy的declarative base管理PostgreSQL架构。 MySQL数据库已经存在,我通过SQLAlchemy的反射访问模式。两者都有非常不同的模式。

我知道我需要为每个数据库提供专用engines,但我不清楚是否需要以下任何一个的专用对象:

  1. Base - 我认为这与数据库架构相对应。由于两个数据库都有非常不同的模式,因此每个模式都需要一个专用的Base

  2. Metadata - 这是否是一个包含所有引擎中所有模式的全局元数据对象?

  3. Sessions - 我不确定,但我认为每个数据库需要单独的会话?或者,一个session可以共享多个engine / Base组合吗?我使用scoped_sessions

  4. 我的一些困惑来自于不理解BaseMetadata之间的区别。 SQLAlchemy docs say

      

    MetaData是一个容器对象,它将所描述的数据库(或多个数据库)的许多不同功能保持在一起。

    这似乎暗示单个metadata可以容纳多个Base,但我对其工作方式仍然有点模糊。例如,我希望能够调用metadata.create_all()并在PostgreSQL中创建表,而不是MySQL。

1 个答案:

答案 0 :(得分:7)

简短的回答是,对于这两个数据库来说,最简单的单独实例都是最简单的。可以创建一个routing session,但它有其警告。

sessionmakerSession也支持passing multiple binds as an argument2-phase commits,这也允许使用包含多个数据库的单个会话。幸运的是,支持两阶段提交的2个数据库是PostgreSQL和MySQL。

关于Basemetadata

之间的关系

Base是一个基类,它有一个元类,用于根据类本身及其子类中提供的信息以声明方式创建Table个对象。 Table的子类隐式声明的所有Base个对象将共享相同的MetaData

您可以在创建新的声明性基础时提供元数据作为参数,从而在多个Base之间共享它,但在您的情况下它没有用。

MetaData  是Table个对象及其关联的模式构造的集合。它还可以绑定EngineSession

简而言之,您可以TableMetaData没有Base,但Base需要MetaData才能运作。