大体思路:
1、使用Python脚本生成100万数据的sql脚本文件存储到本地;
2、使用shell脚本连接数据库,执行生成的sql文件;
3、在python脚本中调用shell脚本并执行即可;
步骤一:使用python每次循环生成10000条插入语句,执行100次循环,生成100万条数据
from hashlib import sha1
from random import randint
import sh
import os
import time
def make_passwd():
return sha1('123456'.encode('utf-8')).hexdigest()
def transaction(per_row_num = 10, sql_row_num = 10):
"""[summary]
per_row_num: 每行多少条记录, 默认每行1000条
sql_row_num:sql行数, 默认生成1000行
[description]
"""
transaction_begin_str = "START TRANSACTION;\n"
transaction_end_str = "COMMIT;\n"
insertStr = "INSERT INTO d_users(uid,nickname,passwd,roleId,gender,status) VALUES"
start_str, end_str = "(", ")"
# 打开文件
with open('insertData.sql', 'w') as f:
# 将SQL语句写入文件
f.write(transaction_begin_str)
for i in range(1, sql_row_num + 1):
f.write(insertStr)
for j in range(1, per_row_num + 1):
f.write(start_str)
# 写入该条记录的学生ID
f.write(str(i * per_row_num * 10 + j) + ', ')
# 写入该条记录的学生昵称
f.write('"tester' + str(i * per_row_num * 10 + j) + '", ')
# 写入该条记录的学生密码
f.write('"'+ make_passwd() + '", ')
# 写入该条记录的学生角色
f.write(str(randint(1, 7)) + ', ')
# 写入该条记录的学生性别
f.write(str(randint(0, 1)) + ', ')
# 写入该条记录的学生启用状态
f.write(str(randint(0, 1)))
f.write(end_str)
if j == per_row_num:
f.write(';\n')
else:
f.write(',')
f.write(transaction_end_str)
f.close()
def execute_sh(path='insertData.sql'):
if os.path.exists(path) and os.path.exists('insert_data.sh'):
os.system('./insert_data.sh')
if __name__ == "__main__":
transaction()
time.sleep(1)
execute_sh()
步骤二:连接mysql,执行数据批量插入的shell脚本
#!/bin/sh
USER=tom
PASSWD=tom
DBNAME=test
TABLENAME=t_users
SQLPATH=/opt/python/scripts/insertData.sql
[ ! -e ${SQLPATH} ] && {
echo "sql file is not exists! ";
exit 1;
}
[ ! -f ${SQLPATH} ] && {
echo "sql file is not exists!";
exit 2;
}
mysql -u${USER} -p${PASSWD} -f ${DBNAME} -e "source ${SQLPATH}";
#mysql -u${USER} -p${PASSWD} -f ${DBNAME} -e "select count(1) from ${TABLENAME}" | sed '1d' | egrep -i "\d+"
echo "数据批量插入成功!";
exit 0
注释
:如果不是本地连接,需要远程连接数据库,首先要确保远程主机可以ping通,可以连接,其次就是远程主机的数据库服务的端口可以访问,使用一下命令即可:
mysql -h 主机Ip -P 端口 -u 用户名 -p 用户密码 -f 数据库名称