【问题标题】:Creating Fixture Data for PostgreSQL with SqlAlchemy and Id's使用 SqlAlchemy 和 Id 为 PostgreSQL 创建夹具数据
【发布时间】:2011-10-25 14:19:13
【问题描述】:

我正在尝试将示例数据注入我的数据库,并创建了一个构建我的模型的夹具文件,然后将实例合并到数据库中。我正在使用合并,因为我希望能够在不重新创建数据库或截断所有表的情况下重新运行夹具。

但是,在检查我的 Postgres 表的主键序列后,my_items_id_seq 在注入 10 个项目后显示以下内容:

       Sequence "public.my_items_id_seq"
    Column     |  Type   |        Value        
---------------+---------+---------------------
 sequence_name | name    | my_items_id_seq
 last_value    | bigint  | 1
 start_value   | bigint  | 1
 increment_by  | bigint  | 1
 max_value     | bigint  | 9223372036854775807
 min_value     | bigint  | 1
 cache_value   | bigint  | 1
 log_cnt       | bigint  | 0
 is_cycled     | boolean | f
 is_called     | boolean | t

如何在我合并夹具数据时增加 last_value?

[编辑]

这里的突出问题是,在注入数据后,如果没有从 SqlAlchemy 获取 IntegrityError,我就无法将项目添加到数据库中。这是因为 PostgreSQL 试图插入我的 id 为 1 的新实例。

【问题讨论】:

    标签: python sql postgresql sqlalchemy pyramid


    【解决方案1】:

    first part of the answer 是通过阅读有关 Django 和 PostgreSQL 的链接获得的,作者在该链接中同样尝试使用索引提供迁移数据。

    他的解决方案是抓取最高的索引,然后执行如下查询:

    alter sequence profile_billingaddress_id_seq restart with {id};
    

    通过这个,我在Sequence Manipulation Functions 的 PostgreSQL 文档中找到了正确的关键字。执行此操作的首选方法是发出此查询:

    select setval('my_items_id_seq', {id})
    

    ... 其中 {id} 显然是一个实整数的占位符。我还注意到 last_value 只是 next_value 的最后一个响应。这很重要,因为使用 setval 而不是上面的 alter sequence 业务可确保 nextval 提供未使用的索引。 IE。使用 setval where id=10 时,nextval 将返回 11。使用 alter sequence 命令时,如果 id=10,则 nextval 也将返回 10。

    【讨论】:

    • 非常感谢您努力发布您自己的答案!这对我帮助很大。
    【解决方案2】:

    我遇到了同样的问题,但我正在尝试为各种不同的型号插入固定装置。

    postgresql's wiki 中的以下小 sn-p 将执行您想要的操作,但针对您架构中的每个序列。

    SELECT 'SELECT SETVAL(' ||
       quote_literal(quote_ident(PGT.schemaname) || '.' || quote_ident(S.relname)) ||
       ', COALESCE(MAX(' ||quote_ident(C.attname)|| '), 1) ) FROM ' ||
       quote_ident(PGT.schemaname)|| '.'||quote_ident(T.relname)|| ';'
    FROM pg_class AS S,
         pg_depend AS D,
         pg_class AS T,
         pg_attribute AS C,
         pg_tables AS PGT
    WHERE S.relkind = 'S'
        AND S.oid = D.objid
        AND D.refobjid = T.oid
        AND D.refobjid = C.attrelid
        AND D.refobjsubid = C.attnum
        AND T.relname = PGT.tablename
    ORDER BY S.relname;
    

    它看起来有点神奇,但完全符合公认的答案。

    【讨论】:

      猜你喜欢
      • 2011-07-21
      • 2015-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-11
      • 2015-05-04
      • 2019-07-10
      相关资源
      最近更新 更多