Создание данных Fixture для PostgreSQL с помощью SqlAlchemy и идентификаторов - PullRequest
1 голос
/ 12 августа 2011

Я пытаюсь внедрить образцы данных в мою базу данных и создал файл фикстуры, который строит мою модель, а затем объединяет экземпляр в базу данных. Я использую слияние, потому что хочу иметь возможность повторно запустить прибор без воссоздания базы данных или усечения всех моих таблиц.

Однако, после проверки последовательности моей таблицы 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.

Ответы [ 2 ]

2 голосов
/ 12 августа 2011

Первая часть ответа состояла в прочтении ссылки на Django и PostgreSQL, где автор аналогичным образом пытался передать данные миграции с помощью индексов.

Его решение состояло в том, чтобы получить самый высокий показатель.index, а затем выполните следующий запрос:

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. При использовании команды изменения последовательности, если id = 10, nextval также вернет 10.

0 голосов
/ 04 октября 2015

У меня была та же проблема, но я пытался вставить приспособления для разных моделей.

Следующий небольшой фрагмент из вики postgresql будет делать то, что вы хотите, но для каждой последовательности в вашей схеме.

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;

Это выглядит немного волшебно, но делает именно то, что предлагает принятый ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...