从MariaDB迁移表至本地MySQL数据库时遇错误求助
问题解决与完整实现方案
核心错误分析
你代码里的问题是错误地给srcEngine添加了自定义的_metadata属性——SQLAlchemy的Engine对象本身并没有这个内置属性,这是你额外添加的,导致后续操作出错。另外,目标公共数据库允许读取元数据,权限不存在问题,问题完全出在代码写法上。
正确实现步骤与代码
下面是完整的表结构+数据复制代码,包含从源库反射表结构、在本地创建表、批量迁移数据的全流程:
from sqlalchemy import create_engine, MetaData, Table # 1. 初始化源数据库引擎(公共库) src_engine = create_engine('mariadb+mariadbconnector://guest:relational@relational.fit.cvut.cz:3306/ConsumerExpenditures') # 2. 初始化本地MySQL数据库引擎(替换成你的本地数据库信息) local_engine = create_engine('mysql+pymysql://your_username:your_password@localhost:3306/your_local_db') # 3. 反射源数据库的元数据(获取所有表结构) src_metadata = MetaData() src_metadata.reflect(bind=src_engine) # 4. 指定需要复制的3张表(替换成实际表名,比如['EXPENDITURES', '表2', '表3']) tables_to_copy = ['EXPENDITURES', '另外两个表名'] # 5. 循环复制每个表的结构和数据 for table_name in tables_to_copy: # 获取源表对象 src_table = src_metadata.tables[table_name] # 在本地数据库创建相同结构的表 src_table.create(bind=local_engine, checkfirst=True) # checkfirst避免重复创建 # 批量迁移数据 with src_engine.connect() as src_conn, local_engine.connect() as local_conn: # 读取源表所有数据 result = src_conn.execute(src_table.select()) data = result.fetchall() # 插入到本地表 if data: local_conn.execute(src_table.insert(), data) local_conn.commit() print(f"表 {table_name} 复制完成")
关键细节说明
checkfirst=True:创建本地表时会先检查是否已存在,避免报错。- 批量插入:用
execute配合批量数据比逐行插入效率高很多,适合中小数据量的表。如果表数据量极大,可以改成分批读取(比如用yield_per()),避免内存溢出。 - 连接上下文管理器:用
with语句自动管理连接的打开和关闭,无需手动调用close()。
内容的提问来源于stack exchange,提问作者chongo1
相关产品推荐
相关产品推荐

