本文目录导读:

- 通用核心原则:随机 + 约束 + 依赖
- 场景1:生成“假数据”用于测试/演示(推荐Python + Faker库)
- 场景2:生成“关联表数据”用于数据库填充(订单 + 用户)
- 场景3:生成“SQL插入脚本”直接用于数据库
- 场景4:生成“大量数据”用于性能测试(注重效率)
- 场景5:生成“结构化/嵌套数据”(JSON/XML)
- 常用工具速查表
- 如何写出“好”的数据生成脚本?
- 快速启动模板(可复制保存)
写“数据生成脚本”取决于你的具体目的(比如测试数据库、生成报表、训练AI模型、压测API等)以及目标格式(SQL、JSON、CSV、假数据表格)。
下面我从最通用、最实用的角度出发,分场景给出示例和思路,帮你快速上手。
通用核心原则:随机 + 约束 + 依赖
一个好的数据生成脚本通常包含三要素:
- 随机性:
random、faker、numpy.random库生成变化。 - 约束/规则:数据范围(年龄 0-120)、字符长度、格式(手机号、邮箱)。
- 依赖关系:用户ID关联订单,城市关联省份(使用映射表或查找字典)。
场景1:生成“假数据”用于测试/演示(推荐Python + Faker库)
这是最常见的需求。faker 库几乎可以生成一切:人名、地址、公司、邮箱、文本。
安装:pip install faker
示例:生成100条用户数据(JSON格式)
from faker import Faker
import json
import random
fake = Faker('zh_CN') # 使用中文语言包
def generate_users(count=100):
users = []
for i in range(count):
user = {
"id": i + 1,
"name": fake.name(),
"phone": fake.phone_number(),
"email": fake.email(),
"address": fake.address(),
"age": random.randint(18, 60),
"job": fake.job(),
"created_at": fake.date_time_this_decade().isoformat()
}
users.append(user)
return users
# 生成并保存
data = generate_users(100)
with open('fake_users.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
print("生成完成,共100条数据。")
输出片段:
[
{
"id": 1,
"name": "李强",
"phone": "13812345678",
"email": "liqiang@example.com",
"address": "北京市朝阳区...",
"age": 35,
"job": "软件工程师",
"created_at": "2023-08-15T14:22:30"
}
]
场景2:生成“关联表数据”用于数据库填充(订单 + 用户)
需要模拟真实业务关系,每个用户有0~3个订单。
from faker import Faker
import random
from datetime import datetime, timedelta
fake = Faker('zh_CN')
def generate_orders(user_count=10, max_orders_per_user=3):
orders = []
order_id = 1
for user_id in range(1, user_count + 1):
# 每个用户随机生成0~3个订单
for _ in range(random.randint(0, max_orders_per_user)):
amount = round(random.uniform(10.0, 5000.0), 2)
status = random.choice(['pending', 'paid', 'shipped', 'completed'])
created = fake.date_time_between(start_date='-30d', end_date='now')
orders.append({
"order_id": order_id,
"user_id": user_id,
"amount": amount,
"status": status,
"created_at": created.isoformat()
})
order_id += 1
return orders
# 使用
user_list = generate_users(10) # 复用前一个函数
order_list = generate_orders(10)
print(f"生成了 {len(user_list)} 个用户,{len(order_list)} 个订单。")
场景3:生成“SQL插入脚本”直接用于数据库
将生成的数据批量拼接成 INSERT INTO 语句,适合给DBA或迁移使用。
from faker import Faker
import random
fake = Faker('zh_CN')
def generate_sql_insert(rows=10):
sql_lines = ["INSERT INTO users (name, age, email) VALUES"]
values = []
for _ in range(rows):
name = fake.name().replace("'", "''") # 防止SQL注入(模拟)
age = random.randint(18, 60)
email = fake.email()
values.append(f"('{name}', {age}, '{email}')")
sql_lines.append(",\n".join(values) + ";")
return "\n".join(sql_lines)
# 使用
print(generate_sql_insert(5))
输出:
INSERT INTO users (name, age, email) VALUES
('张伟', 28, 'zhangwei@example.com'),
('李娜', 35, 'lina@test.com'),
('王芳', 22, 'wangfang@demo.org'),
('刘洋', 41, 'liuyang@mail.com'),
('陈静', 19, 'chenjing@company.cn');
场景4:生成“大量数据”用于性能测试(注重效率)
当需要百万、千万级数据时,Python一次性加载内存可能不够用,此时用生成器或直接写文件。
from faker import Faker
import csv
import random
fake = Faker('zh_CN')
def generate_large_csv(filename, row_count=1_000_000):
with open(filename, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['id', 'name', 'phone', 'balance'])
for i in range(1, row_count + 1):
# 每10万行打印一次进度
if i % 100000 == 0:
print(f"已生成 {i} 行...")
writer.writerow([
i,
fake.name(),
fake.phone_number(),
round(random.uniform(0, 100000), 2)
])
# 生成100万行数据(大约占用40~50MB磁盘空间)
generate_large_csv('test_data.csv', 1_000_000)
print("CSV文件生成完毕。")
提示:对于超大文件(1亿行以上),建议使用
pandas分批写入,或直接用C/Go写脚本效率更高。
场景5:生成“结构化/嵌套数据”(JSON/XML)
适合给API测试或NoSQL数据库(MongoDB)准备数据。
from faker import Faker
import json
fake = Faker('zh_CN')
def generate_complex_json(count=5):
result = []
for _ in range(count):
person = {
"personal": {
"name": fake.name(),
"age": fake.random_int(18, 65),
"contacts": {
"phone": fake.phone_number(),
"email": fake.email()
}
},
"company": {
"name": fake.company(),
"position": fake.job(),
"salary": fake.random_int(5000, 50000)
},
"tags": fake.words(nb=3, unique=True),
"is_active": fake.boolean()
}
result.append(person)
return result
data = generate_complex_json()
with open('complex_data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
常用工具速查表
| 环境/语言 | 推荐库/工具 | 适用场景 |
|---|---|---|
| Python | Faker |
万能假数据(推荐) |
| Python | random + string |
自定义简单随机值 |
| Python | numpy |
大量数值型数据(正态分布、时间序列) |
| SQL | MySQL generate_series() (8.0+), PostgreSQL generate_series() |
直接在数据库中生成测试数据 |
| JavaScript | @faker-js/faker |
Node.js 后端测试 |
| Java | javafaker (DataFaker) |
Java 项目 |
| Go | gofakeit |
Go 后端/CLI工具 |
| 在线工具 | Mockaroo, JSON Generator | 一次性、图形化、导入导出方便 |
如何写出“好”的数据生成脚本?
- 参数化:把数量、文件名、随机种子(seed)作为变量或命令行参数(
argparse)。 - 可重复性:设置
random.seed(42),保证每次运行生成相同数据(方便回归测试)。 - 边界值:专门插入空值、超长字符串、负值等,用于测试程序健壮性。
- 效率:一行一行写文件(
csv.writer)避免大内存占用;使用tqdm加进度条。
快速启动模板(可复制保存)
import argparse
from faker import Faker
import csv, json, random
def main(format='json', count=100, seed=0):
fake = Faker('zh_CN')
random.seed(seed)
data = []
for i in range(count):
data.append({
"id": i+1,
"name": fake.name(),
"value": random.randint(1, 1000)
})
if format == 'json':
with open(f'output_{count}.json', 'w') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
elif format == 'csv':
with open(f'output_{count}.csv', 'w', newline='') as f:
writer = csv.DictWriter(f, fieldnames=data[0].keys())
writer.writeheader()
writer.writerows(data)
print(f"已生成 {count} 条数据到 output_{count}.{format}")
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--format', choices=['json','csv'], default='json')
parser.add_argument('--count', type=int, default=100)
parser.add_argument('--seed', type=int, default=0)
args = parser.parse_args()
main(args.format, args.count, args.seed)
运行:
python generate.py --format json --count 500 --seed 42
如果你能告诉我具体目标(“我想生成1万条订单表记录,关联1000个用户”“只要英文数据”“要包含省市字段”),我可以给你写更直接能用的代码片段。