我正在编写一个算法来填充Postgres中数据库中的所有表。我已经开始流行所有没有关系的表,如下所示:
我使用以下查询获取所有表:
SELECT table_name
FROM information_schema.tables
WHERE table_type = 'BASE TABLE' AND
table_schema NOT IN ('pg_catalog', 'information_schema')
对于获得的表列表,我创建一个循环,并为每个表获取其属性(列名,数据类型,是否接受null,最大字符数):
SELECT COLUMN_NAME, DATA_TYPE,
IS_NULLABLE, CHARACTER_MAXIMUM_LENGTH
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'TABLE_NAME'
使用此属性列表,我动态创建INSERT
INSERT INTO TABLE_NAME(prop1, prop2, prop3) VALUES(value1, value2, value3)
每个值都是根据属性类型随机生成的,例如:
对于算法接受的每种数据类型等等。如果它找到某种不被接受的数据,则应用程序终止(这是预期的)。
此算法中的步骤适用于无关系的表格。
对于有关系的表(1:N,1:1,N:N),我需要首先找到所有外键并了解他们看到哪些表,在此表中输入数据“父”保存ID然后插入“Daughters”表中,从而关联它们的外键。但是如何以简单的方式做到这一点?
值得注意的是,我已经可以通过以下查询获取所有外键的列表:
SELECT conrelid::regclass AS table_from
,conname
,pg_get_constraintdef(c.oid)
FROM pg_constraint c
JOIN pg_namespace n ON n.oid = c.connamespace
WHERE contype IN ('f', 'p ')
AND n.nspname = 'public' -- your schema here
ORDER BY conrelid::regclass::text, contype DESC;
我很感激你的建议。
注意:该算法是用Python开发的。
答案 0 :(得分:0)
使用CTE:
WITH parents AS (
INSERT INTO parent (parent_field)
VALUES ('a'), ('b')
RETURNING id
)
INSERT INTO child (parent_id, child_field)
SELECT id, 'something' FROM parents;
每个父母给你一个孩子;如果您想要多个孩子,请交叉加入子插入中的VALUES
列表,如下所示:
INSERT INTO child (parent_id, child_field)
SELECT id, 'something'
FROM parents
CROSS JOIN (VALUES (1), (2), (3)) AS multiplier;
与双亲插入CTE配对,产生两个父母,每个父母有三个孩子。在VALUES
列表中添加更多条目,为每个父级创建更多子级;内容并不重要,只是数量。