python3全自动批量插入随机数据到mysql

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.<
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值