2013-05-12 2 views
1

Мой код прост:Rose :: DB, кажется, не признает последовательность Postgres

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

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

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

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), и она отлично подходит для этих других таблиц. Но здесь он просто не работает.

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

Кто-нибудь?

+0

Проверьте, какие значения генерирует последовательность ('select * from sequence_name' подходит для этого, просто никогда не используйте полученную информацию для чего-либо важного, только для отладки) и сравнивайте их с максимальным значением, которое в настоящее время находится в таблице. Разворачивает ли ваша структура последовательность в соответствии с текущим максимальным значением в таблице? –

+0

Привет Крейг. Спасибо, что ответили. «Last_value» равно 2, а «max_value» - 9223372036854775807. Помогает ли это? –

+0

Не без текущего максимального значения в таблице, нет. 'SELECT max (id) FROM any_table_is_the_problem'. –

ответ

1

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

primary_key_columns => [ qw(col2) ], 

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

primary_key_columns => [ qw(id) ], 

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

Итак, ошибка была НЕ с Rose :: DB здесь действительно, но с нашим кодом.

Смежные вопросы