【问题标题】:When connecting to multiple databases, do I need multiple SQLAlchemy Metadata, Base, or Session objects?连接到多个数据库时,我需要多个 SQLAlchemy Metadata、Base 或 Session 对象吗?
【发布时间】:2016-07-20 10:57:39
【问题描述】:

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

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

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

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

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

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

我的部分困惑来自于不理解BaseMetadata 之间的区别。 SQLAlchemy docs say

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

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

【问题讨论】:

  • 看看techspot.zzzeek.org/2012/01/11/…,它回答了你的许多问题,虽然读起来有点长。这并不意味着你必须有一个路由会话,但它表明你可以。
  • 简短的回答是肯定的,您需要上述每个实例的单独实例。

标签: python mysql postgresql sqlalchemy


【解决方案1】:

简短的回答是,最简单的方法是为两个数据库分别拥有它们的全部实例。可以创建单个 routing session,但有一些注意事项。

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

关于Basemetadata的关系:

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

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

MetaDataTable 对象及其相关模式结构的集合。它还可以绑定到EngineSession

简而言之,您可以在没有Base 的情况下拥有Tables 和MetaData,但Base 需要MetaData 才能发挥作用。

【讨论】:

    猜你喜欢
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 2012-02-26
    • 2012-02-21
    • 1970-01-01
    相关资源
    最近更新 更多