[Python小工具]Python批量生成数据到MySQL

[Python小工具]Python批量生成数据到MySQL

base.py

#!/usr/bin/python
# -*- coding:utf-8 -*-
import time
import random
from datetime import datetime, timedelta
from faker import Faker
import stringfake = Faker('zh_CN')class Base_conn:# 数据库连接配置初始化def __init__(self, DB_HOST, DB_USER, DB_PASSWORD, DB_NAME):self.DB_HOST = DB_HOSTself.DB_USER = DB_USERself.DB_PASSWORD = DB_PASSWORDself.DB_NAME = DB_NAMEclass TimeShift:def starttime(self):self.start_time = time.time()return self.start_timedef endtime(self):self.end_time = time.time()return self.end_timedef executiontime(self):self.execution_time = self.end_time - self.start_timereturn self.execution_timedef timeshift(self, execution_time):if execution_time < 60:return f"{int(execution_time)}秒"elif execution_time >= 60 or execution_time <= 3600:return f"{execution_time / 60:.1f}分钟"else:return f"{int(execution_time / 60 / 60):.1f}小时"class Table_Employee:# 生成身份证信息的模拟函数,可根据实际情况调整def generate_id_card(self):# region_code = "420100"  # 地区编码region_code = "{:.6f}".format(random.random()).split('.')[1]  # 地区编码birth_date = datetime.strptime("19900101", "%Y%m%d") + timedelta(days=random.randint(0, 365 * 50))  # 出生日期seq_code = str(random.randint(100, 999))  # 序列码gender_code = str(random.randint(0, 9))  # 性别码check_code = str(random.randint(0, 9))  # 校验码(这里仅用于示例)id_card = f"{region_code}{birth_date.strftime('%Y%m%d')}{seq_code}{gender_code}{check_code}"# 确保生成的身份证号码长度正好是 18 个字符return id_card[:18]def __init__(self, work_id=None, name=None, age=None, gender=None, id_card=None, entry_date=None, department=None):# self.work_id = work_id if work_id else fake.pystr(min_chars=3, max_chars=10)self.work_id = work_id if work_id else "{:.6f}".format(random.random()).split('.')[1]self.name = name if name else fake.name()self.age = age if age else random.randint(18, 65)self.gender = gender if gender else fake.random_element(elements=('男', '女'))self.id_card = id_card if id_card else self.generate_id_card()self.entry_date = entry_date if entry_date else (datetime.now() - timedelta(days=random.randint(0, 365 * 10))).date()self.department = department if department else random.randint(1, 7)class Table_Students:def Email_data(self):num_letters = random.randint(5, 10)random_letters = random.choices(string.ascii_letters, k=num_letters)Email = "www." + ''.join(random_letters) + '.com'return Emaildef Address_data(self):provinces = ['北京市', '天津市', '山西省']cities = {'北京市': ['东城区', '西城区', '朝阳区', '海淀区', '丰台区'],'天津市': ['和平区', '河东区', '河西区', '南开区', '红桥区'],'山西省': ['太原市', '大同市', '阳泉市', '长治市', '晋城市']}roads = ['长安街', '和平路', '人民大街', '建国路', '中山路', '解放街', '青年路', '光明街', '文化路', '新华街']province = random.choice(provinces)city = random.choice(cities[province])random_province = random.choice(provinces)random_road = random.choice(roads)random_address = random_province + random_roadrandom_init = str(random.randint(100, 999))address = province + city + random_address + random_init + '号'return addressdef __init__(self, SNo=None, Sname=None, Gender=None, Birthday=None, Mobile=None, Email=None, Address=None,Image='null'):# self.work_id = work_id if work_id else fake.pystr(min_chars=3, max_chars=10)self.SNo = SNo if SNo else str((datetime.now() - timedelta(days=random.randint(0, 365 * 10))).date()).split('-')[0] + str(random.randint(100,999))self.Sname = Sname if Sname else fake.name()self.Gender = Gender if Gender else fake.random_element(elements=('男', '女'))self.Birthday = Birthday if Birthday else (datetime.now() - timedelta(days=random.randint(0, 365 * 10))).date()self.Mobile = Mobile if Mobile else str(random.randint(130, 199)) + "{:.8f}".format(random.random()).split('.')[1]self.Email = Email if Email else self.Email_data()self.Address = Address if Address else self.Address_data()self.Image = Image

mysql_data.py

import re
import time
import pymysql
import threading
from faker import Faker
from pymysql.constants import CLIENT
from base import Base_conn, TimeShift, Table_Employee, Table_Studentsfake = Faker('zh_CN')
# 数据库连接配置
# connect = Base_conn('localhost', 'root', 'iotplatform', 'test')
connect = Base_conn('localhost', 'root', 'iotplatform', 'student_profile_db')def connect_db():try:connection = pymysql.connect(host=connect.DB_HOST,user=connect.DB_USER,password=connect.DB_PASSWORD,database=connect.DB_NAME,client_flag=CLIENT.MULTI_STATEMENTS,cursorclass=pymysql.cursors.DictCursor,charset='utf8mb4')return connectionexcept pymysql.MySQLError as e:print(f"Database connection failed: {e}")return None# 数据插入函数
def insert_data(start, end, thread_id, sql):# 创建数据库连接connection = connect_db()try:# 创建 cursor 用于执行 SQL 语句with connection.cursor() as cursor:sql_cmd = sqlfor i in range(start, end):# 记录最后一次用于插入的数据table_employee = Table_Employee()table_students = Table_Students()# last_values = (table_employee.work_id,#                table_employee.name,#                table_employee.age,#                table_employee.gender,#                table_employee.id_card,#                table_employee.entry_date,#                table_employee.department)last_values = (table_students.SNo,table_students.Sname,table_students.Gender,table_students.Birthday,table_students.Mobile,table_students.Email,table_students.Address,table_students.Image)# 执行 SQL 语句cursor.execute(sql_cmd, last_values)connection.commit()# 提交事务# connection.commit()# print(f"Thread {thread_id}: Inserted rows {start} to {end}")except Exception as e:print(f"Thread {thread_id}: Error occurred: {e}")finally:# if last_values:#     print(f"Thread {thread_id}: Inserted rows {start} to {end}. Last row data: {last_values}")# 关闭数据库连接connection.close()def perform_sql_operation(sql, operation):conn = connect_db()num = 0try:with conn.cursor() as cursor:if operation in ('select', 'show'):cursor.execute(sql)for row in cursor.fetchall():print(row)elif operation in ('update', 'delete'):cursor.execute(sql)num += 1conn.commit()print('执行sql数:', num)except pymysql.MySQLError as e:print(f"Error: {e}")conn.rollback()finally:conn.close()def insert_sql(sql_command, total_records, num_threads):total_records = total_records  # 总共需要插入的记录数num_threads = num_threads  # 线程数量records_per_thread = total_records // num_threads  # 每个线程需要插入的记录数sql_cmd = sql_commandthreads = []for i in range(num_threads):start_index = i * records_per_threadend_index = start_index + records_per_threadend_index = min(end_index, total_records)thread_id = i + 1# 创建线程thread = threading.Thread(target=insert_data, args=(start_index, end_index, thread_id, sql_cmd))threads.append(thread)thread.start()# 等待所有线程完成for thread in threads:thread.join()def up_del_sel_sql(sql_cmd):sql_command = sql_cmdperform_sql_operation(sql_command, command)# 主函数,负责创建线程并分配任务
def main(sql):if sql.lower() == 'insert':insert_sql(sql_cmd, total_records, num_threads)elif sql.lower() in ('update', 'delete', 'select', 'show'):up_del_sel_sql(sql_cmd)else:print('请传入执行的sql类型: [insert|update|delete|select]')if __name__ == '__main__':# 总共需要插入的记录数total_records = 1000000# 开启线程数量num_threads = 1# 执行sql# sql_cmd = """ insert into `employee` (`workid`, `name`, `age`, `gender`, `idcard`, `entrydate`, `department`)#               values (%s, %s, %s, %s, %s, %s, %s) """sql_cmd = """ insert into `Student` (`SNo`, `Sname`, `Gender`, `Birthday`, `Mobile`, `Email`, `Address` , `Image`)values (%s, %s, %s, %s, %s, %s, %s,%s) """# sql_cmd = "delete from employee limit 100000"# sql_cmd = "select count(*) from employee"# sql_cmd = "show tables like '%employee%'"# sql_cmd = ""command = re.search(r'\binsert|update|delete|select|show\b', sql_cmd, re.IGNORECASE)command = command.group().lower() if command else Noneif command:time_shift = TimeShift()start_time = time_shift.starttime()main(command)end_time = time_shift.endtime()execution_time = time_shift.timeshift(time_shift.executiontime())print(f"执行时间: {execution_time}")else:print('未找到匹配的命令')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/660491.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如果我要访问一个网址,那么在网络中会有哪些过程

访问一个网址是我们日常网络使用中非常常见的操作&#xff0c;背后涉及到一系列精密而复杂的步骤。这个过程包括DNS解析、建立TCP连接、发起HTTP请求、服务器处理请求、服务器响应、浏览器渲染等环节。在这篇文章中&#xff0c;我们将深入探讨这些步骤&#xff0c;并解释它们在…

redis配置信息整理

redis部署分为几种方式&#xff1a;单机、哨兵&#xff08;主从&#xff09;、集群。对应这几种部署方式redis的配置信息也有不同&#xff0c;总结如下&#xff1a; 单机模式&#xff1a; spring:redis:database: 0timeout: 8000password: 123456host: 192.168.56.101port: 6…

强大的虚拟机Parallels Desktop 19 mac中文激活

Parallels Desktop是一款功能全面、易于使用的虚拟机软件&#xff0c;它为用户提供了在Mac电脑上同时运行多个操作系统的便利。 软件下载&#xff1a;Parallels Desktop 19 mac中文激活版下载 Parallels Desktop 19 mac具有快速启动和关闭虚拟机的能力&#xff0c;让用户能够迅…

基于SpringBoot+Vue学科竞赛管理系统

文章目录 基于SpringBootVue学科竞赛管理系统1系统概述1.3系统设计思想 2相关技术2.1 MYSQL数据库2.2 B/S结构2.3 Spring Boot框架简介2.4 Vue简介 3系统分析3.1可行性分析3.1.1技术可行性3.1.2经济可行性3.1.3操作可行性 3.2系统性能分析3.2.1 系统安全性3.2.2 数据完整性 3.4…

Wampserver 切换中文时无法启动报错处理

在使用 Wampserver 软件时默认为英语&#xff0c;可以看到有语言选择功能&#xff0c;切换其他语言。但选择中文切换后&#xff0c;软件重启时报如下错误&#xff1a; The configuration file contains a systax error on line 44:[EParseError] Mismatched or misplaced quoue…

(十六)串口UART

文章目录 UART简介传输数据帧和波特率定时器1作为串口1波特率发生器串口部分相关寄存器TMODAUXRPCONSCONSBUF 串口1工作模式1&#xff1a;8位UART&#xff0c;波特率可变总体工作原理如何简单接收一个字符和发送数据一步之遥的设置现象演示 UART简介 通用异步收发传输器(Unive…

1汇编学习 用chatGPT来分析汇编的含义:让一切变的容易 每句注释 OllyDbg 用chatGPT来学习:让一切变的容易,迅速成为绝顶高手

用chatGPT来学习&#xff1a;让一切变的容易&#xff0c;迅速成为绝顶高手 004010C1 > 8A83 1A214000 mov al, byte ptr [ebx40211A] 004010C7 . 3C 00 cmp al, 0 004010C9 . 74 08 je short 004010D3 004010CB . 3C 47 cmp al, 47 004010CD . 75 01 jnz short 004010D0 00…

计算机网络(第六版)复习提纲19

SS4.4 网际控制报文协议ICMP ICMP报文作为IP数据报的数据部分&#xff0c;加上IP报文的首部进行发送 一 ICMP报文的种类 1 ICMP差错报告报文 有四种ICMP差错报告报文 ①终点不可达&#xff0c;路由器或者主机不能交付数据报时向原点发送 ②时间超过&#xff0c;当路由器收到生…

一种轻量分表方案-MyBatis拦截器分表实践|京东零售技术实践

背景 部门内有一些亿级别核心业务表增速非常快&#xff0c;增量日均100W&#xff0c;但线上业务只依赖近一周的数据。随着数据量的迅速增长&#xff0c;慢SQL频发&#xff0c;数据库性能下降&#xff0c;系统稳定性受到严重影响。本篇文章&#xff0c;将分享如何使用MyBatis拦…

微软Azure-OpenAI 测试调用及说明

本文是公司在调研如何集成Azure-openAI时&#xff0c;调试测试用例得出的原文&#xff0c;原文主要基于官方说明文档简要整理实现 本文已假定阅读者申请部署了模型&#xff0c;已获取到所需的密钥和终结点 变量名称值ENDPOINT从 Azure 门户检查资源时&#xff0c;可在“密钥和…

Advanced CNN

文章目录 回顾Google NetInception1*1卷积Inception模块的实现网络构建完整代码 ResNet残差模块 Resedual Block残差网络的简单应用残差实现的代码 练习 回顾 这是一个简单的线性的卷积神经网络 然而有很多更为复杂的卷积神经网络。 Google Net Google Net 也叫Inception V…

java基础面试题:BIO,NIO,AIO 有什么区别?

BIO、NIO和AIO是Java中用于处理I/O操作的不同编程模型&#xff0c;它们有以下区别&#xff1a; 阻塞 I/O&#xff08;BIO&#xff09;&#xff1a;BIO是传统的阻塞式I/O模型&#xff0c;它基于流&#xff08;Stream&#xff09;和阻塞调用&#xff0c;即当一个线程执行I/O操作时…

5、应急响应-拒绝服务钓鱼识别DDOS压力测试邮件反制分析应用日志

目录 前言&#xff1a; 1、#内网应急-日志分析-爆破&横向&数据库 2、#红队APT-钓鱼邮件识别-内容&发信人&附件 3、#拒绝服务攻击-DDOS&CC-代理&防火墙防御 用途&#xff1a;个人学习笔记&#xff0c;欢迎指正&#xff01; 前言&#xff1a; 了解和…

OkHttp完全解读

一&#xff0c;概述 OkHttp作为android非常流行的网络框架&#xff0c;笔者认为有必要剖析此框架实现原理&#xff0c;抽取并理解此框架优秀的设计模式。OkHttp有几个重要的作用&#xff0c;如桥接、缓存、连接复用等&#xff0c;本文笔者将从使用出发&#xff0c;解读源码&am…

深度视频恢复软件推荐,轻松恢复视频文件!

“我在电脑上保存了一些视频&#xff0c;但在清理时却不小心将这些视频删除了&#xff0c;有什么方法可以恢复删除的视频吗&#xff1f;希望大家给我推荐一些好用的方法。” 随着科技的飞速发展&#xff0c;数字媒体已经成为了我们生活中不可或缺的一部分。然而&#xff0c;数字…

国图公考:考公和考编一样吗?

公务员&#xff1a;是指在各级机关中&#xff0c;符合规定&#xff0c;行使职权&#xff0c;执行公务的人员 事业单位&#xff1a;事业单位是指由国家或社会组织举办&#xff0c;从事教育、科学、文化、卫生、体育等社会公益事业的单位。 公务员和事业编都是有编制的&#xf…

【lesson33】MySQL使用C/C++连接

文章目录 mysql connectConnector/C 使用mysql接口介绍完整代码 mysql connect mysql的基础&#xff0c;我们之前已经学过&#xff0c;后面我们只关心使用 要使用C语言连接mysql&#xff0c;需要使用mysql官网提供的库&#xff0c;大家可以去官网下载 我们使用C接口库来进行连…

C++入门学习(二十二)选择结构-三目运算符

三目运算符&#xff0c;是一个程序开发的术语&#xff0c;优先级高于赋值、逗号运算符&#xff0c;低于其他运算符。适用于程序开发。 格式&#xff1a; condition ? expression1 : expression2 其中&#xff0c;condition 是一个布尔表达式&#xff0c;expression1 和 expr…

dataframe 列按指定字符截取

创建一个示例 import pandas as pd data {Column1: [1~2, 21~3, 3~41, 411~5], } test_df pd.DataFrame(data) print(test_df) 截取 ’~ ‘前、后的值 test_df[Column1_left] test_df[Column1].apply(lambda x: x.split(~)[0] if pd.notnull(x) else np.nan) test_df[…

基于微信安徽合肥景点订票小程序系统设计与实现 研究背景和意义、国内外现状

博主介绍&#xff1a;黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者&#xff0c;CSDN博客专家&#xff0c;在线教育专家&#xff0c;CSDN钻石讲师&#xff1b;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…