SQLAlchemy:如何将数据从旧数据库中的一个表转移到新数据库中的另一个表?

时间:2018-09-24 16:15:38

标签: python sqlalchemy

我正在使用python中的sqlalchemy将一些数据从一个数据库传输到另一个数据库。我想直接进行快速转移。

我不知道如何使用SQLAlchemy的bulk_insert_mappings()函数。 (在字段方面,两个表都相同)

这是我到目前为止尝试过的。

from sqlalchemy import create_engine, Column, Integer, String, Date  
from sqlalchemy.orm import sessionmaker  
from sqlalchemy.ext.declarative import declarative_base  

engine_old = create_engine('mysql+pymysql://<id>:<pw>@database_old.amazonaws.com:3306/schema_name_old?charset=utf8')  
engine_new = create_engine('mysql+pymysql://<id>:<pw>@database_new.amazonaws.com:3306/schema_name_new?charset=utf8')   

data_old = engine_before.execute('SELECT * FROM table_old')  

session = sessionmaker()  
session.configure(bind=engine_after)  
s = session()  

如何处理“ s.bulk_insert_mappings(????,data_old)”?**

有人可以帮助我吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

有很多方法可以将数据从一个数据库移到另一个数据库。该方法的特异性取决于您的个人需求以及您已经实施的方法。假设旧数据库和新数据库都已经在各自的DB中具有模式,则需要两个单独的baseengine。现有数据库模式的映射是使用automap_base()实现的。下面,我分享了一个简短的示例:

from sqlalchemy.orm import Session
from sqlalchemy import create_engine
from sqlalchemy.ext.automap import automap_base

old_base = automap_base()
old_engine = create_engine("<OLD_DB_URI>", echo=True)
old_base.prepare(old_engine, reflect=True)
TableOld = old_base.classes.table_old
old_session = Session(old_engine)

new_base = automap_base()
new_engine = create_engine("<NEW_DB_URI>", echo=True)
new_base.prepare(new_engine, reflect=True)
TableNew = old_base.classes.table_new
new_session = Session(new_engine)

# here you can write your queries
old_table_results = old_session.query(TableOld).all()
new_data = []
for result in old_table_results:
    new = TableNew()
    new.id = result.id
    new.name = result.name
    new_data.append(new)
new_session.bulk_save_objects(new_data)
new_session.commit()

现在,关于您的第二个问题,这是直接来自SQLAlchemy网站的示例链接:http://docs.sqlalchemy.org/en/latest/_modules/examples/performance/bulk_inserts.html,为回答您的问题,bulk_insert_mappings在上面的示例中采用了两个参数作为db模型(TableNew或TableOld)以及表示数据库模型中实例(又称行)的词典列表。