企业生产实践--生产环境批量插入百万数据到数据库几种实现方式(三)

大体思路:
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 数据库名称

你可能感兴趣的:(Python)