Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> perl+postgres, ошибка, в DBD::pg 
:(
    Опции темы
Gekt0r
Дата 3.11.2009, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 10.4.2008

Репутация: нет
Всего: нет



Всем привет, возникла проблемка...
Есть сервер Апач, на котором стоит mod_perl, есть база postgres.
На сайте есть скрипт, который время от времени закидывает в базу данные. Так вот, если база пуста, то все проходит нормально.
Если база не пуста, т.е. данные перезаписываются, то вылазит ошибка DBD::Pg:smileb "array must be one-dimensional"

с чем это может быть связано?
PM MAIL   Вверх
krypt3r
Дата 3.11.2009, 12:17 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 9.6.2009

Репутация: 2
Всего: 16



Может, мы код сможем увидеть?
PM MAIL   Вверх
Gekt0r
Дата 6.11.2009, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 10.4.2008

Репутация: нет
Всего: нет



в общем нашел я проблемную строчку:

Код

$keeper->{SQL}->do("update $keeper->{documents_table} set mtime = now(), dtime = ?, sections = ?, status = ?, name = ? where id = ?", 
{}, $self->{dtime}, '{'.join(',', $self->sections() ).'}', $self->{status}, $self->{name}, $self->{id}) 
|| do  { $keeper->error(); $keeper->{SQL}->rollback()    if ( ! $keeper->{handcommit}); return undef };




($keeper - глобальный объект, которая используется для связи с БД)

Это сообщение отредактировал(а) Gekt0r - 6.11.2009, 11:39
PM MAIL   Вверх
Bulat
Дата 6.11.2009, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



Gekt0r, какая структура модифицируемой таблицы $keeper->{documents_table}, 

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

Это сообщение отредактировал(а) Bulat - 6.11.2009, 12:47


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
krypt3r
Дата 6.11.2009, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 9.6.2009

Репутация: 2
Всего: 16



Есть подозрение, что в колонку, описанной как одномерный массив, пытаются вставить двумерный. Тут надо дебужить и смотреть данные, которые пишутся в таблицу
PM MAIL   Вверх
Gekt0r
Дата 6.11.2009, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 10.4.2008

Репутация: нет
Всего: нет



я вывел в логи то, что хранится в массиве. Как правило это просто число (номер секции). В какой-то момент там появляется число в фигурных скобках (например, {1511}, и выскакивает ошибка. Я так предполагаю, что тут дело в формате записи массива в postgres и perl.
откуда только эти фигурные скобки берутся, пока непонятно :(
PM MAIL   Вверх
krypt3r
Дата 6.11.2009, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 9.6.2009

Репутация: 2
Всего: 16



Фигурные скобки означают, что это массив - тип данных PostgreSQL array
http://www.postgresql.org/docs/8.4/static/arrays.html

ЗЫ. Дайте все-таки дамп структуры таблицы

Это сообщение отредактировал(а) krypt3r - 6.11.2009, 14:52
PM MAIL   Вверх
Bulat
Дата 6.11.2009, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



Gekt0r, возьми pgAdmin - приконнектись к БД и ждем структуры таблицы. Самый простой способ узнать, ИМХО...  smile

Сиквел начинающийся с Create table ... smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
DEER
Дата 6.11.2009, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 749
Регистрация: 12.4.2005
Где: г. Рязань

Репутация: 1
Всего: 13



Gekt0r,  ontico?


--------------------
 
PM MAIL WWW ICQ MSN   Вверх
Gekt0r
Дата 9.11.2009, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 10.4.2008

Репутация: нет
Всего: нет



Цитата(DEER @ 6.11.2009,  17:37)
Gekt0r,  ontico?

да)

ща, кое-какие идеи возникли, попробую разобраться, не получится, напишу снова)
PM MAIL   Вверх
DEER
Дата 9.11.2009, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 749
Регистрация: 12.4.2005
Где: г. Рязань

Репутация: 1
Всего: 13



Короче.
1) используй метод store для изменений данных в БД. Зачем изобретать велосипед?
Код

$self->store(); # даные или занеслись в БД, или обновились

2) Если очень НАДО использовать именно sql (я правда не понимаю ЗАЧЕМ), то скорее всего ошибка в $keeper->{documents_table}
то есть логичнее сделать так
Код

$keeper->{SQL}->do("update $self->table set mtime = now(), dtime = ?, sections = ?, status = ?, name = ? where id = ?", 
{}, $self->{dtime}, '{'.join(',', $self->sections() ).'}', $self->{status}, $self->{name}, $self->{id}) 
|| do  { $keeper->error(); $keeper->{SQL}->rollback()    if ( ! $keeper->{handcommit}); return undef };

3) Ты подписан на внутрнюю рассылку? Есть вопросы - пиши туда! Разберемся гораздо быстрее

Это сообщение отредактировал(а) DEER - 9.11.2009, 13:34


--------------------
 
PM MAIL WWW ICQ MSN   Вверх
Gekt0r
Дата 10.11.2009, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 10.4.2008

Репутация: нет
Всего: нет



Разобрался.
Глюк был в функции $self->sections(), соответственно, строчке 
Код
'{'.join(',', $self->sections() ).'}'


функция иногда возвращала данные в формате массива, с фигурными скобками, а иногда - просто как скаляр. Соответственно, когда возвращался массив, ему добавлялись еще одни фигурные скобки, откуда и возникала ошибка "array must be one-dimensional"
Исправил (:

Почему не использовать $self->store()? Просто этот код, что я привел - как раз из функции store()  smile 

А что за внутренняя рассылка, как подписаться?
PM MAIL   Вверх
DEER
Дата 10.11.2009, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 749
Регистрация: 12.4.2005
Где: г. Рязань

Репутация: 1
Всего: 13



странно, что 
 
Код
'{'.join(',', $self->sections() ).'}'

глючит. Как ты правильно сказал этот код из Ontico::Utils и везде так работает...

про подписку ответил ЛС

Добавлено через 1 минуту и 25 секунд
правда ща посмотрел, там немного не так.
Код

sub array_to_sql {
    return unless ref $_[0] eq 'ARRAY';
    return '{' . join( ',' => @{$_[0]} ) . '}';
}

надо тоже проверку делать наверное


--------------------
 
PM MAIL WWW ICQ MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0499 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.