Python-生成随机数据插入MySQL表中
本文没有使用Faker,而是自己根据需求编写函数生成随机的数据,然后插入MySQL表中。
-
1.MySQL表
CREATE TABLE `t_trans_detail` ( `product` varchar(20) DEFAULT NULL COMMENT '产品', `trans_time` datetime DEFAULT NULL COMMENT '交易时间', `trans_amount` decimal(20,2) DEFAULT NULL COMMENT '交易金额' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-
2.数据要求
1)、产品是固定的几个产品。
2)、交易日期是指定范围的日期时间。
3)、交易金额是指定范围的数据,可以设置小数位的位数。
4)、随机插入100条数据。
-
3.Python实现代码
# coding=utf-8 import pymysql import random import datetime def generate_date(start_date_str, end_date_str): """ 生成指定范围内的随机日期 :param start_date_str: 起始日期字符串,格式 "YYYY-MM-DD" :param end_date_str: 结束日期字符串,格式 "YYYY-MM-DD" :return: (随机日期) """ # 解析日期字符串为datetime.date对象 start_date = datetime.datetime.strptime(start_date_str, "%Y-%m-%d").date() end_date = datetime.datetime.strptime(end_date_str, "%Y-%m-%d").date() # 计算日期范围的天数差 delta_days = (end_date - start_date).days # 生成随机日期 random_days = random.randint(0, delta_days) random_date = start_date + datetime.timedelta(days=random_days) return random_date def generate_datetime(start_datetime_str, end_datetime_str): """ 生成指定时间范围内的随机日期时间(精确到秒) :param start_str: 起始时间字符串,格式 "YYYY-MM-DD HH:MM:SS" :param end_str: 结束时间字符串,格式 "YYYY-MM-DD HH:MM:SS" :return: 随机生成的datetime对象 """ # 解析输入时间为datetime对象 start_time = datetime.datetime.strptime(start_datetime_str, "%Y-%m-%d %H:%M:%S") end_time = datetime.datetime.strptime(end_datetime_str, "%Y-%m-%d %H:%M:%S") # 校验时间范围有效性 if start_time > end_time: raise ValueError("起始时间不能晚于结束时间") # 计算时间差(秒数) delta_seconds = int((end_time - start_time).total_seconds()) # 生成随机秒数偏移 random_seconds = random.randint(0, delta_seconds) # 生成随机时间 return start_time + datetime.timedelta(seconds=random_seconds) def generate_double(double_min, double_max, scale): """ 生成指定范围内Double值 :param double_min: Double最小值 :param double_max: Double最大值 :param scale: 表示小数部分的位数 :return: (随机Double值) """ # 生成随机Double值(保留几位小数) random_double = round(random.uniform(double_min, double_max), scale) return random_double if __name__ == '__main__': # 产品字段的取值列表 product_list = ['小米', '华为', '苹果', 'oppo', 'vivo'] # 定义插入数据的条目数 insert_num = 100 # 交易时间(开始时间和结束) start_datetime = "2018-01-01 00:00:00" end_datetime = "2019-01-01 00:00:00" # 交易金额(最小值,最大值,小数部分的位数) trans_amount_min = 0 trans_amount_max = 10000 scale = 2 # 数据库连接 conn = None try: # 数据库连接配置 conn = pymysql.connect( host="127.0.0.1", port=3306, user="root", passwd="Root@1234", db="test", charset="utf8" ) # 插入表的SQL语句 sql = "insert into t_trans_detail(product,trans_time,trans_amount) values(%s,%s,%s)" # 使用cursor()方法获取数据库的操作游标 with conn.cursor() as cursor: try: # 遍历插入数据 for i in range(insert_num): # 产品 product = random.choice(product_list) # 交易时间 trans_time = generate_datetime(start_datetime, end_datetime) # 交易金额 trans_amount = generate_double(trans_amount_min, trans_amount_max, scale) # SQL传入参数 params = (product, trans_time, trans_amount) # 执行SQL insert_rows = cursor.execute(sql, params) # 使用mogrify()直接生成完整SQL formatted_sql = cursor.mogrify(sql, params) # 打印执行结果 print("执行SQL:", formatted_sql, ", 添加语句受影响的行数:", insert_rows) # 提交事务 conn.commit() # 最后执行结果 print("\n{} 行数据插入执行成功!".format(insert_num)) except Exception as e: conn.rollback() print(f"批量插入失败: {e}") except Exception as e: print(f"数据库连接失败: {e}") finally: # 关闭数据库连接 if conn: conn.close()
-
4.执行结果
-
5.查询表中数据
本文来自博客园,作者:业余砖家,转载请注明原文链接:https://www.cnblogs.com/yeyuzhuanjia/p/18835319