Я пытаюсь ввести образцы данных в свою базу данных и создал файл привязки, который создает мою модель, а затем объединяет экземпляр в базу данных. Я использую merge, потому что хочу иметь возможность повторно запускать прибор без повторного создания базы данных или усечения всех моих таблиц.
Однако после проверки моей последовательности 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, когда я объединю данные привязки?
[редактировать]
Выдающаяся проблема заключается в том, что после ввода данных я не могу добавлять элементы в базу данных, не получая IntegrityError из SqlAlchemy. Это связано с тем, что PostgreSQL пытается вставить мой новый экземпляр с идентификатором 1.
Первая часть ответа была получена путем чтения ссылки на Django и PostgreSQL, где автор аналогичным образом попытался передать данные миграции с помощью индексов.
Его решение заключалось в том, чтобы захватить самый высокий индекс, а затем выполнить следующий запрос:
alter sequence profile_billingaddress_id_seq restart with {id};
Благодаря этому я обнаружил правильное ключевое слово в документации PostgreSQL о функциях манипуляции последовательностями. Предпочтительный способ сделать это - выдать этот запрос:
select setval('my_items_id_seq', {id})
... где {id}, очевидно, является заполнителем для действительного целого числа. Также мне пришло в голову, что last_value - это всего лишь последний ответ от next_value. Это важно, потому что использование setval вместо вышеперечисленной бизнес-операции гарантирует, что nextval предоставляет неиспользуемый индекс. Т.е. при использовании setval, где id = 10, nextval вернет 11. При использовании команды alter sequence, если id = 10, then nextval также вернет 10.
У меня была такая же проблема, но я пытался вставить светильники для разных моделей.
Следующий небольшой фрагмент из postgresql 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;
Это выглядит немного волшебным, но делает то, что предлагает принятый ответ.