python3全自动批量插入随机数据到mysql
环境准备:
用pycharm创建一个python项目,把以下三个文件都放到项目的根目录下(如果你对 pycharm 和 python 比较熟悉也可以放到不同的其它目录下) ,根据三个文件的报错信息安装缺少的模块,大概用到了:pymysql、string、random、time、decimal 几个常见模块 。
db_config.py
mysql_table.py
mysql_random.py
大体实现思路:
通过mysql的 information_schema.COLUMNS 表获得表的数据结构信息,根据这些信息,解析数据类型,并匹配相应的随机函数和参数,最后产生随机数据批量插入到mysql数据库中。
如何处理得批量插入重复键问题:
插入批量随机数据难免会遇到重复键的问题,这里使用了insert ignore into 语句,如果表中有unique的列,再遇到随机数据有重复,insert会自动忽略重复键的记录,不至于会影响后面的插入,所以我们指定的插入条数不一定会和我们预期的相同。
警告与局限:
此python程序只能处理:tinyint、smallint、medimuint、int、bigint、float、double、date、datetime、varchar、char、enum 这些 mysql的常用数据类型,不能处理 bit、set、text、blob 等数据类型,如果想让程序能处理更多数据类型,须自己实现,如果看明白那三个文件的源码实现会很简单,只是我暂时用不到这些数据类型所有没有实现它们。
如果不想改代码,又想处理未实现的数据类型,比如 text 类型,可以尝试给出钩子(hook)函数,后面会给出示例怎么使用钩子。
如果想一次性插入1亿条数据,请先看看机器的内存会不会溢出。一般的小表每一万条数据大概1Mb的数据量,一百万条数据一般的机器应该能受的住,如果受不住可以 用 for 循环分开调用。
如果遇到一些我没有处理的bug ,建议自己debug一下代码。
几个文件的作用:
db_config.py:
数据库的配置文件,记得改自己的数据库账号密码。如果不改数据库的名称:schemaName,需要在插入表时在表前加库的前缀,比如代码里曾用到 Table(‘information_schema.COLUMNS’),就是通过在表前就库前缀实现跨库操作的
mysql_table.py:
对select 、insert 语句的封装,如果接触过 pymysql ,大体看看应该就会明白,分离出来主要是为了减少代码冗余,很多需求都可能会与pymysql 交互,比如我的爬虫模块也调用了mysql_table模块
mysql_random.py:
这是关键性文件,可以先读注释,再 debug,请注意下面有个小 demo 可先测试一下向 test.user表中插入100条记录
using.sql:
mysql 测试表,也可以自己设计一个表测试
autofill.py:
我自己的一些应用示例,可以参考这些示例使用
db_config.py
username = "root"
password = "root"
host = "127.0.0.1"
port = 3306
schemaName = "test"
mysql_table.py
import pymysql
from db_config import *
class Table(object):
def __init__(self, table_name):
self.tableName = table_name
@staticmethod
def connection():
connec = pymysql.connect(
host=host,
port=port,
user=username,
password=password,
database=schemaName,
cursorclass=pymysql.cursors.DictCursor
)
return connec
def find(self, columns='*', where='true'):
connec = self.connection()
cursor = connec.cursor()
sql = "SELECT {} FROM {} where {}".format(columns, self.tableName, where)
cursor.execute(sql)
result = cursor.fetchall()
connec.close()
return result
def save_batch(self, cols="", vals=[]):
assert len(vals) > 0
connec = self.connection()
cursor = connec.cursor()
f = ','.join(['%s' for val in vals[0]])
sql = "INSERT INTO {} ({}) VALUES ({})".format(self.tableName, cols, f)
print(sql)
cursor.executemany(sql, vals)
connec.commit()
connec.close()
mysql_random.py
import random
import string
import time
from decimal import Decimal
from mysql_table import Table
class Columns(object):
# 初始化过程:
# 从mysql的数据表:information_schema.COLUMNS 中下载 schema_table 表的相关信息
# 通过列的数据类型名称 匹配 解析函数,比如 varchar 类型会匹配到 varchar()函数
# 解析函数会获取到随机函数及随机函数的参数,比如 varchar函数会匹配到随机函数 r_char,及其参数 (10,)
# 手动指定钩子函数,会强制使某个列使用指定的随机函数及指定的参数
def __init__(self, schema_table, hook={
}):
# 存放 表列,比如:[u_age,u_score,u_money,update_time,u_birth,u_sex,u_name,u_address]
self.<