我正在尝试将示例数据注入我的数据库,并创建了一个用于构建模型的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的新实例。
答案 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;
它看起来有点神奇,但确实接受了接受的答案。