Ads 468x60px

воскресенье, 1 апреля 2012 г.

Debian squeeze работа perl с postgresql.

Установка postgresql достаточно полно описана на wiki.debian.org.
От себя добавлю:
           для включения удаленного доступа по сети необходимо в файле /etc/postgresql/8.4/main/postgresql.conf, в секции # CONNECTIONS AND AUTHENTICATION заменить #listen_addresses = 'localhost', к примеру, на listen_addresses = '*', где '*' означает все адреса, или указать свои значения. Кроме этого необходимо добавить запись в файл /etc/postgresql/8.4/main/pg_hba.conf, в секции # IPv4 local connections добавить следующее, заменив 192.168.1.0/24 - на свой диапазон адресов:
host    all         all         192.168.1.0/24          md5
 а вопрос возможной ошибки
psql: FATAL:  Ident authentication failed for user
на мой взгляд, правильнее решать заменой в файле /etc/postgresql/8.4/main/pg_hba.conf   ident на md5
 local   all         all                               md5     #replace ident or peer with md5
Установка модуля perl для работ с postgresql:
# sudo aptitude install libclass-dbi-pg-perl
Убедиться в том, что драйвер установлен можно выполнив:
# perl -e 'use DBI; print $_,"\n" foreach DBI->available_drivers;' | grep Pg
При условии, что база в postgresql создана, можно написать пример скрипта для работы с базой. Все комментарии непосредственно в самом коде.
#!/usr/bin/perl
#dbipg.plx
use warnings;
use strict;
use DBI; # подключаем класс работы с базами

# имя базы, имя пользователя базы, пароль 
my ($dbname,$dbuser,$dbpass) = ('perl','perluser','perlpass');
# сервер и порт для удаленного подключения
my ($dbhost,$dbport) = ('192.168.1.103','5432');
# схема, таблица, колонки, типы данных
my ($schema,$table,$col1,$col2,$col3,$type1,$type2,$type3)
  =("public","perltable","id","name","born","serial","text","date");

# подключение к локальнoй базе
# my $dbh = DBI->connect("dbi:Pg:dbname=$dbname", $dbuser, $dbpass,
#                         { RaiseError => 1,  # в случае ошибки на строне базы данных прерывать работу perl
#                          AutoCommit => 0 }) # отключение автоматической фиксации изменнений
#             or die $DBI::errstr;
# 
# $dbh->disconnect();
# подключение к удаленной базе
my $dbh = DBI->connect("dbi:Pg:dbname=$dbname;host=$dbhost;port=$dbport", $dbuser, $dbpass,
                        { RaiseError => 1
                        , AutoCommit => 0 })
            or die $DBI::errstr;

# Перед созданием проверяем наличе таблицы
# Получаем список таблиц в выбранной нами схеме
my @tables = $dbh->tables($dbname,$schema);
my $istable = 0;
foreach (@tables) {
    if ($_ eq "$schema.$table") {
        $istable = 1;
        last;
    }
}
if ($istable){
        print "$dbname.$schema.$table all ready exists.\n";
} else { # Создание таблицы 
        my $ddl = "Create Table ".$table."(".$col1." ".$type1.
                                         ",".$col2." ".$type2.
                                         ",".$col3." ".$type3.
                                         ")";
        $dbh->do($ddl)
        or die $DBI::errstr;
}

# список колнок таблицы
my $sth = $dbh->column_info( $dbname, $schema, $table, '%' );
while ( my @sth = $sth->fetchrow_array() ) {
    my ($col,$type) = ($sth[3],$sth[5]);
    print $col,"    ",$type, "\n";
}
$sth->finish();

# вставка данных
my ($val2,$val3) = ('name','2012-04-01');
# в переменную $sth попадет количество добавленных строк или 0E0, если 0 строк
$sth=$dbh->do("Insert Into $table ($col2,$col3) Values (?,?)",undef,($val2,$val3));
## id последней добавленной строки
my $seqname = $table.'_'.$col1.'_seq'; # верно, если последовательность создавалась postgresql автоматом
my $lastid = $dbh->last_insert_id(undef,undef,undef,undef,{sequence=>$seqname});
print "Last inset id: $lastid.\n";

# Изменение данных
$sth=$dbh->do("Update $table Set ($col2,$col3) = (?,?) Where id = ?"
             ,undef,("U$val2",$val3,$lastid-1));
if ($sth eq "0E0"){
    print "0 rows update\n";
} else {
    print "Update $sth rows in $table\n";
}

# пример выбоки данных
$sth=$dbh->prepare("Select $col1,$col2,$col3 From $table Where $col1 = ?");
$sth->bind_param( 1,$lastid);
$sth->execute();
# вывод заголовка столбцов
print $_."\t| " foreach @{$sth->{NAME}};
print "\n","="x35,"\n";
# вывод значений
while ( my @sth = $sth->fetchrow_array() ) {
    print $_."\t| " foreach @sth;
    print "\n";
}
$sth->finish();

# Удаление 
$sth=$dbh->do("Delete From $table Where $col1 < ?",undef,($lastid-3));
if ($sth eq "0E0"){
    print "0 rows delete\n";
} else {
    print "Delete $sth rows from $table\n";
}


$dbh->commit; # необходимо только в случае если установлен параметр AutoCommit => 0
$dbh->disconnect();
Проверка результатов:
# psql perl -U perluser -W -c "Select * from perltable order by id"
По использованию bind переменных возможны различия зависят от версии базы данных, в моем случае PostgreSQL 8.4.11
Дополнительную информацию можно почерпнуть из следующих источников:
cpan DBI.pm
Programming the Perl DBI
icmp.ru DBD::Pg 

Комментариев нет: