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.查询表中数据

 

posted @ 2025-04-19 12:45  业余砖家  阅读(76)  评论(0)    收藏  举报