我正在使用 python 中的 sqlalchemy 将一些数据从一个数据库传输到另一个数据库。我想直接快速转账。
我不知道如何使用bulk_insert_mappings()
来自 SQLAlchemy的功能。(在字段方面,两个表是相同的)
这是我到目前为止所尝试的。
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()
Run Code Online (Sandbox Code Playgroud)
如何处理“s.bulk_insert_mappings(????, data_old)”?**
有人可以帮助我吗?
谢谢你。
有很多方法可以实现将数据从一个数据库移动到另一个数据库。该方法的特殊性取决于您的个人需求和您已经实施的内容。假设旧数据库和新数据库在它们各自的数据库中都有一个模式,您将需要两个单独的base
s 和engine
s。现有数据库模式的映射是使用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()
Run Code Online (Sandbox Code Playgroud)
现在,关于你的第二个问题,这里有一个直接来自 SQLAlchemy 网站的示例链接:http : //docs.sqlalchemy.org/en/latest/_modules/examples/performance/bulk_inserts.html并回答你的问题bulk_insert_mappings
需要一个两个参数 a db上面示例中的模型(TableNew 或 TableOld)以及表示 db 模型中的实例(又名行)的字典列表。