1. Faker 简介

Faker 是一个 Python 库,用于生成各种类型的虚假数据,非常适合测试、开发和演示。本教程将展示如何使用 Faker 生成中文测试数据,并将其插入到 PostgreSQL 数据库中。

2. 环境准备

首先确保已安装必要的库:

pip install faker psycopg2

3. 基础代码解析

3.1 初始化 Faker 并设置中文

from faker import Faker
faker = Faker("zh-CN")  # 设置为中文环境

3.2 创建 PostgreSQL 数据库表

import psycopg2

sql1 = '''
create table if not exists faker(
    id serial primary key,
    name varchar(200),
    password varchar(100),
    ssn char(18),
    phone_number char(11),
    email varchar(100),
    company varchar(200),
    job varchar(200),
    province varchar(100),
    address varchar(200),
    sentence text
)
'''

3.3 数据库连接配置

connect_str = "host=127.0.0.1 port=5432 dbname=postgres user=postgres password=123456 client_encoding='UTF8'"
conn = psycopg2.connect(connect_str)
c = conn.cursor()
c.execute(sql1)

4. 使用 Faker 生成测试数据

4.1 生成单个数据记录

dics = {
    'name': faker.name(),                 # 中文姓名
    'password': faker.password(special_chars=False),  # 密码
    'ssn': faker.ssn(),                   # 身份证号
    'phone_number': faker.phone_number(),  # 手机号
    'email': faker.email(),                # 电子邮箱
    'company': faker.company(),            # 公司名称
    'job': faker.job(),                    # 职位
    'province': faker.province(),          # 省份
    'address': faker.address(),            # 详细地址
    'sentence': faker.sentence(),          # 随机句子
}

4.2 批量生成数据

lsts = []
for i in range(100):  # 生成100条记录
    dics = {
        'name': faker.name(),
        'password': faker.password(special_chars=False),
        'ssn': faker.ssn(),
        'phone_number': faker.phone_number(),
        'email': faker.email(),
        'company': faker.company(),
        'job': faker.job(),
        'province': faker.province(),
        'address': faker.address(),
        'sentence': faker.sentence(),
    }
    lsts.append(dics)

5. 插入数据到 PostgreSQL

5.1 准备 SQL 语句

columns = ','.join(dics.keys())  # 获取所有列名
qmarks = ','.join(['%s'] * len(dics))  # 创建占位符
sql2 = f'insert into faker({columns}) values({qmarks})'  # 完整的插入语句

5.2 转换数据格式并执行

values = [tuple(dics.values()) for dics in lsts]  # 将字典列表转换为元组列表
c.executemany(sql2, values)  # 批量执行

5.3 提交事务并关闭连接

conn.commit()  # 提交事务
conn.close()  # 关闭连接

6. 完整代码示例

from faker import Faker
import psycopg2

# 初始化Faker,设置为中文
faker = Faker("zh-CN")

# 创建表SQL
sql1 = '''
create table if not exists faker(
    id serial primary key,
    name varchar(200),
    password varchar(100),
    ssn char(18),
    phone_number char(11),
    email varchar(100),
    company varchar(200),
    job varchar(200),
    province varchar(100),
    address varchar(200),
    sentence text
)
'''

# 连接PostgreSQL
connect_str = "host=127.0.0.1 port=5432 dbname=postgres user=postgres password=123456 client_encoding='UTF8'"
conn = psycopg2.connect(connect_str)
c = conn.cursor()
c.execute(sql1)

# 生成100条测试数据
lsts = []
for i in range(100):
    dics = {
        'name': faker.name(),
        'password': faker.password(special_chars=False),
        'ssn': faker.ssn(),
        'phone_number': faker.phone_number(),
        'email': faker.email(),
        'company': faker.company(),
        'job': faker.job(),
        'province': faker.province(),
        'address': faker.address(),
        'sentence': faker.sentence(),
    }
    lsts.append(dics)

# 准备插入语句
columns = ','.join(dics.keys())
qmarks = ','.join(['%s'] * len(dics))
sql2 = f'insert into faker({columns}) values({qmarks})'

# 转换数据格式并执行
values = [tuple(dics.values()) for dics in lsts]
c.executemany(sql2, values)

# 提交并关闭连接
conn.commit()
conn.close()

print("成功插入100条测试数据!")

7. 效果查看

8. 常见问题解决

  1. 中文乱码问题
    • 确保数据库连接字符串中包含 client_encoding='UTF8'
    • 确认数据库和表的编码设置为UTF-8
  2. 数据类型不匹配
    • 检查生成的假数据是否符合表定义的数据类型
    • 例如身份证号应为18位,手机号应为11位
  3. 连接问题
    • 确认PostgreSQL服务正在运行
    • 检查连接参数是否正确(主机、端口、用户名、密码)
  4. 性能优化
    • 对于大量数据插入,考虑使用 COPY 命令代替多次 INSERT
    • 可以分批提交,比如每1000条提交一次

9. 扩展应用

  1. 自定义数据生成器

    from faker.providers import BaseProvider
    
    class MyProvider(BaseProvider):
        def custom_ssn(self):
            return '110101' + self.numerify('##########')
    
    faker.add_provider(MyProvider)
    
  2. 其他语言环境

    # 英文数据
    faker_en = Faker("en-US")
    # 日文数据
    faker_jp = Faker("ja_JP")
    
  3. 更多Faker方法

    • faker.date_of_birth() - 出生日期
    • faker.credit_card_full() - 信用卡信息
    • faker.file_name() - 文件名
    • faker.user_agent() - 浏览器User-Agent

通过本教程,您应该已经掌握了使用Faker生成测试数据并插入PostgreSQL数据库的基本方法。这对于开发测试、数据分析和演示都非常有用。关注以下公众号,获取最新PG帖子。

posted on 2025-04-22 22:11  jl1771  阅读(95)  评论(0)    收藏  举报