Jef*_*man 1 python mysql postgresql sqlalchemy
我正在编写一个需要连接到PostgreSQL数据库和MySQL数据库的SQLAlchemy应用程序.基本上我是从现有MySQL数据库加载数据,对其进行一些转换,然后将其保存在PostgreSQL中.
我正在使用SQLAlchemy管理PostgreSQL架构declarative base.MySQL数据库已经存在,我通过SQLAlchemy的反射访问模式.两者都有非常不同的模式.
我知道我需要专门engines为每个数据库,但我不清楚我是否需要以下任何一个的专用对象:
Base - 我认为这对应于数据库架构.由于两个数据库都有非常不同的模式,因此我需要专用Base于每个模式.
Metadata - 这是否是一个包含所有引擎的所有模式的单个全局元数据对象?
Sessions - 我不确定,但我认为每个数据库需要单独的会话?或者可以单个session共享多个engine/ Base组合?我正在使用scoped_sessions.
我困惑的一部分来自不理解之间的差异Base和Metadata.在SQLAlchemy的文档说:
MetaData是一个容器对象,它将所描述的数据库(或多个数据库)的许多不同功能保持在一起.
这似乎意味着单个metadata可以容纳多个Base,但我仍然有点模糊它的工作原理.例如,我希望能够metadata.create_all()在PostgreSQL中调用和创建表,而不是MySQL.
简短的回答是,对于两个数据库来说,最简单的实例都是最简单的.可以创建单个路由会话,但它有其警告.
的sessionmaker和Session还支持通过多个结合作为一个参数和2阶段提交,这也可允许使用具有多个数据库的单个会话.幸运的是,支持两阶段提交的2个数据库是PostgreSQL和MySQL.
有关之间的关系Base和metadata:
Base是一个基类,它有一个元类,用于Table根据类本身及其子类中提供的信息以声明方式创建对象.Table由子类隐式声明的所有对象Base将共享相同的对象MetaData.
您可以在创建新的声明性基础时提供元数据作为参数,从而在多个Bases 之间共享它,但在您的情况下它没有用处.
MetaData
是Table对象及其关联的模式构造的集合.它也可以绑定一个Engine或Session.
简而言之,你可以拥有Tables而MetaData没有a Base,但Base需要MetaData运行.
| 归档时间: |
|
| 查看次数: |
1515 次 |
| 最近记录: |