Rose::DB не распознает последовательность Postgres

Мой код прост:

eval {
    my $item = $_table1_class->new(
        field1 => $val1,
        field2 => $val2,
        field3 => $val3,
    );
    $item->save;
};
if ($@) {
   .
   .
   .
   # Error handling stuff.
   .
   .
   .
}

Когда код запускается, я получаю сообщение об ошибке: "ОШИБКА: нулевое значение в столбце" id "нарушает ограничение not-null". Сообщение об ошибке также указывает, что строка, в которой находится ошибка, является "$item->save;" линия.

Таблица базы данных PostgreSQL, в которую я пытаюсь записать, имеет поле id в дополнение к field1, field2 и field3. Поле id определяется как:

id | integer | not null default | nextval('table1_id_seq'::regclass)

Это отражено в коде для класса, который я определяю для Rose::DB для этой таблицы. Для поля id для этой таблицы у меня есть код:

id => { 
     type => 'serial', 
     not_null => 1, 
     primary_key => 1, 
     sequence => 'table1_id_seq', 
},

Что в мире может быть здесь не так?

Странно то, что все это сработало сегодня утром. Я изменил вещи, которые не должны влиять на это вообще, и он просто перестал работать. Я вырывал свои волосы весь день. Мне кажется довольно ясным, что Rose::DB должна получать PostgreSQL для создания идентификатора из последовательности. Но, похоже, этого не происходит. Я использую этот простой способ обновления других таблиц точно так же, как эта конкретная таблица (mutatis mutandis), и он отлично работает для этих других таблиц. Но здесь это просто не работает.

У кого-нибудь есть идеи по этому поводу? Глядя на сеть, я вижу, что у других были проблемы, которые кажутся связанными, но я не могу найти никакого решения в сообщениях в других местах в сети.

Кто-нибудь?

1 ответ

Решение

Я понял. Проблема заключалась в том, что в моем классе для таблицы было указано другое поле в качестве первичного ключа от "id". Код гласил:

primary_key_columns => [ qw( col2 ) ],

(Я не писал этот код.) Когда я изменил это на:

primary_key_columns => [ qw( id ) ],

Это снова сработало. Что меня беспокоит, так это то, почему это сработало. Это определенно работало, а то, что я делал в другом месте кода, похоже, разбудило Rose::DB, что что-то здесь не так, и оно перестало работать.

Таким образом, ошибка была не в Rose::DB, а в нашем коде.

Другие вопросы по тегам