PostgresQL中流行表的算法

时间:2016-12-26 16:08:50

标签: python algorithm postgresql

我正在编写一个算法来填充Postgres中数据库中的所有表。我已经开始流行所有没有关系的表,如下所示:

  1. 我使用以下查询获取所有表:

    SELECT table_name
       FROM information_schema.tables
    WHERE table_type = 'BASE TABLE' AND
       table_schema NOT IN ('pg_catalog', 'information_schema')
    
  2. 对于获得的表列表,我创建一个循环,并为每个表获取其属性(列名,数据类型,是否接受null,最大字符数):

    SELECT COLUMN_NAME, DATA_TYPE,
       IS_NULLABLE, CHARACTER_MAXIMUM_LENGTH
    FROM INFORMATION_SCHEMA.COLUMNS
       WHERE TABLE_NAME = 'TABLE_NAME'
    
  3. 使用此属性列表,我动态创建INSERT

    INSERT INTO TABLE_NAME(prop1, prop2, prop3) VALUES(value1, value2, value3)
    
  4. 每个值都是根据属性类型随机生成的,例如:

    • 整数:65422
    • 性格:“Lorem ipsum ......”
    • 日期:2016-12-12 20:00

    对于算法接受的每种数据类型等等。如果它找到某种不被接受的数据,则应用程序终止(这是预期的)。

    1. 最后,安装INSERT后,我在数据库中执行查询
    2. 此算法中的步骤适用于无关系的表格。

      对于有关系的表(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开发的。

1 个答案:

答案 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列表中添加更多条目,为每个父级创建更多子级;内容并不重要,只是数量。