【发布时间】:2016-07-20 10:57:39
【问题描述】:
我正在编写一个需要连接到 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 中。
【问题讨论】:
-
看看techspot.zzzeek.org/2012/01/11/…,它回答了你的许多问题,虽然读起来有点长。这并不意味着你必须有一个路由会话,但它表明你可以。
-
简短的回答是肯定的,您需要上述每个实例的单独实例。
标签: python mysql postgresql sqlalchemy