背景

有时候,我们为了测试数据库的性能,通常需要快速构建测试数据,PgSql 提供了快速构建数据的工具,方便我们能够快捷的构建模拟数据。

生成函数

顺序生成

生成 SQL

-- 生成一批顺序值
SELECT
id
FROM
GENERATE_SERIES(1, 10) t(id);

结果

id
1
2
3
4
5
6
7
8
9
10

随机数

生成 SQL

-- 生成一批随机整型
SELECT
(RANDOM() * 100)::INT
FROM
GENERATE_SERIES(1, 10)
;

结果

int4
66
8
11
36
53
43
22
94
99
36

随机字符串

生成 SQL

-- 生成一批随机字符串
SELECT
MD5(RANDOM()::TEXT)
FROM
GENERATE_SERIES(1, 10);
md5
717e8603559b452af4bfd6e9631096d0
07320af223c367eb02984eb7e85d74a9
d99e7ccb95873e7bf69a64c04ba5e7d3
2a6bac203480291cd1bdbaa5e8eb856f
320e52646959fdc8d3f17d10e50be6e4
d4e35b9bcbe466e2b5516602f7cf76cd
8695b0d27430bc9a2635954bb2246b51
448e4d4985c0dac75536045abcfc21e9
32d9de8bda7c16d6d4ee4225fe9e62fa
70e0092ed83668552b5304d052fcdcf0

随机中文

生成随机中文函数

-- 随机中文函数
CREATE OR REPLACE FUNCTION gen_hanzi(INT) RETURNS TEXT AS
$$
DECLARE
res TEXT;
BEGIN
IF $1 >= 1 THEN
SELECT STRING_AGG(CHR(19968 + (RANDOM() * 20901)::INT), '') INTO res FROM GENERATE_SERIES(1, $1);
RETURN res;
END IF;
RETURN NULL;
END;
$$ LANGUAGE plpgsql STRICT;

生成汉字 SQL

-- 生成随机汉字
SELECT
gen_hanzi(10)
FROM
GENERATE_SERIES(1, 10);

结果

gen_hanzi
鬁絹囬橩微鯤馴潳嫕甡
擭嫩馣倂差榦逝薍艾荰
猧炒畴稛瑵操綂愘冯粌
款应闦岷衕後槀鷰鞃絑
卺翦骚騕裰简鑝櫒窂産
魴旻閖烀呾岨垯勣拏澥
鵅伩睰蹵臱嘦刃鍑璓冠
睛锱賃轋賁件蝔婘鳗椩
瞉斑酃惪荦桔灪濭脦娰
豟噹癀僨緯翁豃揵嗪訅

身份证号

生成身份证号函数

-- 随机身份证号函数
CREATE OR REPLACE FUNCTION gen_id(
a DATE,
b DATE
)
RETURNS TEXT AS
$$
SELECT
LPAD((RANDOM() * 99)::INT::TEXT, 2, '0') ||
LPAD((RANDOM() * 99)::INT::TEXT, 2, '0') ||
LPAD((RANDOM() * 99)::INT::TEXT, 2, '0') ||
TO_CHAR(a + (RANDOM() * (b - a))::INT, 'yyyymmdd') ||
LPAD((RANDOM() * 99)::INT::TEXT, 2, '0') ||
RANDOM()::INT ||
(CASE WHEN RANDOM() * 10 > 9 THEN 'X' ELSE (RANDOM() * 9)::INT::TEXT END) ;
$$ LANGUAGE sql STRICT;

生成随机身份证号 SQL

-- 随机身份证号
SELECT
gen_id('1900-01-01', '2017-10-16')
FROM
GENERATE_SERIES(1, 10);

结果

gen_id
409560192602091816
163490201705024702
797974192007296218
429540201212090405
846256194810318314
244942195609190207
729623200508134305
589417196110115508
882567199310083306
67153519821129281X

随机日期

生成随机日期函数

-- 生成随机日期
CREATE OR REPLACE FUNCTION get_rand_date(start_date DATE, end_date DATE) RETURNS DATE AS
$BODY$
DECLARE
interval_days INTEGER ;
random_days INTEGER ;
random_date DATE ;
BEGIN
interval_days := end_date - start_date;
random_days := TRUNC(RANDOM() * (interval_days - 1) + 1);
random_date := start_date + random_days;
RETURN random_date;
END ;
$BODY$
LANGUAGE plpgsql;

生成随机日期 SQL

SELECT
get_rand_date('2018-01-01', '2023-12-01')
FROM
GENERATE_SERIES(1, 10);

结果

get_rand_date
2020-06-23
2021-04-16
2019-01-18
2022-09-18
2018-06-08
2023-11-24
2022-01-25
2019-08-21
2023-06-08
2018-09-02

随机时间

生成随机时间函数

-- 生成随机时间
CREATE OR REPLACE FUNCTION get_rand_datetime(start_date DATE, end_date DATE) RETURNS TIMESTAMP AS
$BODY$
DECLARE
interval_days INTEGER;
random_seconds INTEGER;
random_dates INTEGER;
random_date DATE;
random_time TIME;
BEGIN
interval_days := end_date - start_date;
random_dates := TRUNC(RANDOM() * interval_days);
random_date := start_date + random_dates;
random_seconds := TRUNC(RANDOM() * 3600 * 24);
random_time := ' 00:00:00'::TIME + (random_seconds || ' second')::INTERVAL;
RETURN random_date + random_time;
END;
$BODY$
LANGUAGE plpgsql;

生成随机时间 SQL

SELECT
get_rand_datetime('2018-01-01', '2023-12-01')
FROM
GENERATE_SERIES(1, 10);

结果

get_rand_datetime
2021-06-20 20:33:32.000000
2021-10-01 18:47:55.000000
2021-07-12 00:10:05.000000
2019-03-23 18:32:06.000000
2023-04-03 20:23:25.000000
2022-07-09 10:12:32.000000
2019-12-02 20:08:22.000000
2021-11-14 06:51:23.000000
2023-05-10 07:42:13.000000
2021-09-07 23:11:36.000000

枚举字符串

生成枚举字符串函数

-- 返回随机字符串函数
CREATE OR REPLACE FUNCTION get_split_str(str VARCHAR) RETURNS VARCHAR AS
$BODY$
DECLARE
array_str VARCHAR[];
i INT;
rand_index INT;
BEGIN
str := TRIM(str);
array_str := REGEXP_SPLIT_TO_ARRAY(str, '[,,]');
--正在表达式匹配
-- array_length(array_str,1)1代表维度,一维、二维
rand_index := CAST((RANDOM() * (ARRAY_LENGTH(array_str, 1) - 1) + 1) AS INT);
RETURN array_str[rand_index];
END ;
$BODY$
LANGUAGE plpgsql;

生成枚举字符串 SQL

-- 返回指定的字符串
SELECT
get_split_str('hello ,zdata ,asher ,enmo,mogdb,zcloud')
FROM
GENERATE_SERIES(1, 10);

结果

get_split_str
asher
mogdb
asher
zcloud
asher
asher
mogdb
enmo
asher
enmo

指定范围 INT

生成指定范围的 INT 函数

CREATE OR REPLACE FUNCTION get_rand_int(m INT, n INT) RETURNS INT AS
$BODY$
BEGIN
RETURN CAST((RANDOM() * (n - m) + m) AS INT);
END ;
$BODY$
LANGUAGE plpgsql;

SQL

SELECT
get_rand_int(100, 1000)
FROM
GENERATE_SERIES(1, 10)
;

结果

get_split_str
asher
mogdb
asher
zcloud
asher
asher
mogdb
enmo
asher
enmo

指定范围 BIGINT

生成指定范围 BIGINT 函数

CREATE OR REPLACE FUNCTION get_rand_bigint(m BIGINT, n BIGINT) RETURNS BIGINT AS
$BODY$
BEGIN
RETURN CAST((RANDOM() * (n - m) + m) AS BIGINT);
END ;
$BODY$
LANGUAGE plpgsql;

SQL

SELECT
get_rand_bigint(100, 1000)
FROM
GENERATE_SERIES(1, 10)
;

结果

get_rand_bigint
703
958
213
835
699
152
561
832
834
478

生成模拟数据

-- 创建 user 数据表

CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(255) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
id_card VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
phone VARCHAR(20),
address VARCHAR(255),
job_title VARCHAR(255),
education_level VARCHAR(255),
salary DECIMAL(10, 2),
hire_date DATE,
leave_date DATE,
remarks TEXT,
status VARCHAR(255),
created_at TIMESTAMP,
created_by VARCHAR(255) DEFAULT 'system'
); -- 批量生成 1W 条模拟数据 INSERT INTO
users (username, password, id_card, email, phone, address, job_title, education_level, salary, hire_date, leave_date, remarks, status, created_at)
SELECT
SUBSTR(MD5(RANDOM()::TEXT), 10),
MD5(RANDOM()::TEXT),
gen_id('1970-01-01', '2018-10-16'),
SUBSTR(MD5(RANDOM()::TEXT), 10) || '@qq.com',
get_rand_bigint(13812341234, 19912341234),
gen_hanzi(10),
get_split_str('JAVA,C++,SQL,VUE,WEB,C#,C,GO'),
get_split_str('本科,硕士,博士,专科'),
get_rand_int(6000, 30000),
get_rand_date('2018-01-01', '2023-12-01'),
get_rand_date('2018-01-01', '2023-12-01'),
SUBSTR(MD5(RANDOM()::TEXT), 10),
get_split_str('在职,离职'),
get_rand_datetime('2018-01-01', '2023-12-01')
FROM
GENERATE_SERIES(1, 10000);

PGSQL快速生成模拟数据的更多相关文章

  1. 在java中调用mockjs生成模拟数据

    一.手写版 在前端有个模拟数据的神器 Mock.js 能生成随机数据,拦截 Ajax 请求,然后我觉得他的这个生成随机数据不错.然后我就到度娘一顿操作,没找到类似的java实现,于是就有了下面的代码: ...

  2. mock的使用二(根据数据模板生成模拟数据)

    Mock.mock( rurl?, rtype?, template|function( options ) ) 根据数据模板生成模拟数据. Mock.mock( template ) 根据数据模板生 ...

  3. 使用Faker库生成模拟数据

    一.相关文档 该库在laravel框架中默认已经存在,无需手动进行安装.使用参考文档: https://packagist.org/packages/fzaninotto/faker 二.简单示例 & ...

  4. 【转】 关于data factory的介绍——即如何快速生成大批量数据

    上次在我的博客中讲述了quest公司的spotlight系列软件,这次来扯淡一下quest公司的另一测试辅助软件 datafactory(数据工厂),顾名思义,数据工厂是生产数据的,主要应用领域是性能 ...

  5. sql快速生成大量数据

    先插入一条数据 insert into table(a,b,c,d) values(1,2,3,4) 然后重复执行以下sql语句 没执行一次 数据就会倍增 insert into table(a,b, ...

  6. VS快速生成JSON数据类

    1.复制Json数据 2.

  7. mockjs 加上 json-server 快速生成前端数据

    const mock = require('mockjs'); // 引入mockjs const data = mock.mock({ "data|20": [{ "i ...

  8. Spring Boot(九)Swagger2自动生成接口文档和Mock模拟数据

    一.简介 在当下这个前后端分离的技术趋势下,前端工程师过度依赖后端工程师的接口和数据,给开发带来了两大问题: 问题一.后端接口查看难:要怎么调用?参数怎么传递?有几个参数?参数都代表什么含义? 问题二 ...

  9. Spark项目之电商用户行为分析大数据平台之(十二)Spark上下文构建及模拟数据生成

    一.模拟生成数据 package com.bw.test; import java.util.ArrayList; import java.util.Arrays; import java.util. ...

  10. lazy-mock ,一个生成后端模拟数据的懒人工具

    lazy-mock   lazy-mock 是基于koa2构建的,使用lowdb持久化数据到JSON文件.只需要简单的配置就可以实现和json-server差不多的功能,但是比json-server更 ...

随机推荐

  1. 结合pandas,sqlite3批量将csv数据导入sqlite数据库

    import sqlite3 import pandas as pd conn=sqlite3.connect(r'demo.db') c=conn.cursor() 创建新表 c.execute(& ...

  2. 【2020.11.25提高组模拟】树的解构(deconstruct) 题解

    [2020.11.25提高组模拟]树的解构(deconstruct) 题解 题目描述 给一棵以\(1\)为根的外向树,进行\((n-1)\)次删边操作,每次都会从没有删掉的边中等概率地删掉一条边\(a ...

  3. React-native之Flexbox

    本文总结: 我们学到了 React Native 的 Flexbox 布局,它让写样式变得更方便啦! Flexbox 就像一个有弹性的盒子,有主轴和交叉轴(行或列). 在 RN 里写样式要用 Styl ...

  4. 「Note」POI 套题

    POI 2011 \(\color{limegreen}{P3524}\) 此题是奇妙题. 每次删两个不连通的点,最多删掉 \(\frac{n}{3}\) 个点, 剩下的点一定都在团内,选 \(\fr ...

  5. C#实现Stdio通信方式的MCP Server

    该专栏优先在飞书发布,欢迎收藏关注! https://www.feishu.cn/community/article?id=7507084665509904403 前面的课程,我们已经实现SSE通信方 ...

  6. MySQL 主从延迟导致业务数据不一致

    场景: 写入一条优惠劵数据,然后将该优惠劵信息读取出来同步给下游数据 现象: 本地写入优惠劵数据成功,同步信息成功.上周同步数据代码正常,周末改了发送优惠劵的信息,然后周一来了发现同步数据无法同步. ...

  7. 关于python的一些学习笔记

    一种是利用三引号的方法.三引号下默认允许自动换行,第二种就是在文字之间插入\n这种方式(使用转义字符) 这里是关于转义字符的一些总结. 2.关于运算符号 小学除法取余%,中学开n方**,小学除法取整/ ...

  8. Linux在线安装JDK1.8+

    Linux在线安装JDK1.8+(默认已发布最新版) 命令在线下载jdk: wget --no-check-certificate --no-cookies --header "Cookie ...

  9. Django数据库配置避坑指南:从初始化到生产环境的实战优化

    一.数据库配置 介绍 Django 4.2 支持多种数据库后端 数据库类型 推荐版本 官方支持 驱动 / 后端 默认端口 适用场景 备注 PostgreSQL 12+ psycopg2-binary ...

  10. AI应用实战课学习总结(6)分类算法分析实战

    大家好,我是Edison. 最近入坑黄佳老师的<AI应用实战课>,记录下我的学习之旅,也算是总结回顾. 今天是我们的第6站,一起了解下分类算法基本概念 以及 通过分类算法辅助疾病诊断的案例 ...