使用SqlAlchemy和Id创建PostgreSQL的Fixture数据

时间:2011-08-12 07:23:38

标签: python sql postgresql sqlalchemy pyramid

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

但是,在检查了我的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的新实例。

2 个答案:

答案 0 :(得分:2)

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提供未使用的索引。即当使用setval,其中id = 10时,nextval将返回11.当使用alter sequence命令时,如果id = 10,则nextval也将返回10.

答案 1 :(得分:0)

我有同样的问题但是试图为各种不同的模型插入灯具。

来自postgresql's wiki的以下小片段将完成您想要的内容,但适用于您架构中的每个序列。

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;

它看起来有点神奇,但确实接受了接受的答案。