在工作中需要对数据库中的数据做迁移,需要将元数据库中的指定表数据导出,但是常用工具导出的insert语句再插入时效率较低,或者导出速度太慢等等问题,浅学python写个小脚本导出数据,再浅浅分享下,记录我的学习之路
import mysql.connector
import os
# MySQL数据库连接信息
mysql_config = {
'host': 'your_host',
'user': 'your_username',
'password': 'your_password',
'database': 'your_database',
'port': 'your_port', # 修改时需要改成int类型
'charset': 'utf8'
}
# 连接到MySQL数据库
def connect_to_mysql():
try:
conn = mysql.connector.connect(**mysql_config)
return conn
except mysql.connector.Error as err:
print("MySQL连接错误:", err)
return None
# 生成SQL文件
def generate_sql_file(table_name, data, file_path):
try:
with open(file_path, 'a') as f:
f.write(f'INSERT INTO {table_name} VALUES\n')
for row in data:
f.write('(' + ', '.join(map(str, row)) + '),\n')
f.seek(-2, os.SEEK_END) # 移动到倒数第二个字符
f.truncate() # 删除最后一个逗号和换行符
f.write(';\n\n')
except Exception as e:
print("写入SQL文件时出错:", e)
# 从数据库获取数据并生成SQL文件
def generate_sql_files(conn, table_name, output_dir):
cursor = conn.cursor()
try:
chunk_size = 100 # 每条 insert 语句中包含的数据条数
inserts_per_file = 10 # 每个 SQL 文件中包含的 insert 语句数
count = 1
offset = 0
while True:
cursor.execute(f'SELECT * FROM {table_name} LIMIT 1000 OFFSET {offset}') # 每次获取 1000 条数据
rows = cursor.fetchall()
if not rows: # 如果没有获取到数据就跳出循环
break
for i in range(0, len(rows), chunk_size * inserts_per_file):
file_name = os.path.join(output_dir, f'{table_name}_{count}.sql')
with open(file_name, 'w', encoding='utf-8') as f:
for j in range(inserts_per_file):
start_idx = i + j * chunk_size
end_idx = min(start_idx + chunk_size, len(rows))
chunk = rows[start_idx:end_idx]
if not chunk: # 如果数据为空则跳出循环
break
generate_sql_inserts(table_name, chunk, f)
count += 1
offset += 1000 # 更新 OFFSET
except mysql.connector.Error as err:
print("MySQL查询错误:", err)
finally:
cursor.close()
# 生成insert语句
def generate_sql_inserts(table_name, data, file):
file.write(f'INSERT INTO {table_name} VALUES\n')
for i, row in enumerate(data):
values = ', '.join(f"'{value}'" if isinstance(value, str) else str(value) for value in row)
file.write(f'({values})')
if i < len(data) - 1:
file.write(',\n')
else:
file.write(';\n')
# 主函数
def main():
conn = connect_to_mysql()
if conn:
table_name = 'your_table' # 指定表名
output_dir = 'D:\\sql_file' # 指定输出目录
if not os.path.exists(output_dir):
os.makedirs(output_dir)
generate_sql_files(conn, table_name, output_dir)
conn.close()
if __name__ == '__main__':
main()
作为一个python初学者,上述内容若有不足之处,希望各位大神能够给予指导和建议。