URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 3701
[ Назад ]

Исходное сообщение
"Perl + Psql"

Отправлено alexeylomov , 08-Дек-04 18:12 
Здравствуйте. Есть база данных mydb. Там есть таблица mytable.
В которой есть столбцы name и id. По id мне нужно достать name.
Ручками это выглядит так:
mydb=# SELECT name FROM mytable WHERE id = '1.1';
А сейчас потребовалось доставать это имя скриптом на перле.
В умной книжке нашёл только описание как это сделать используя
модуль pgsql_perl5, но использовать этот модуль у меня нет возможности.
Подскажите, пожалуйста, как мне это сделать, или дайте ссылку, где можно
найти решение. Спасибо.

Содержание

Сообщения в этом обсуждении
"Perl + Psql"
Отправлено XMan , 09-Дек-04 02:51 
Все смотрят в сторону модулей DBI и DBD::MySQL.
Будешь пользовать DBI - забудешь о переписывании скрипта под разные серверы. Он для того и сделан.

"Perl + Psql"
Отправлено wersa , 09-Дек-04 12:25 
попробуй примерно так

        $SQL=<<EOF;

                SELECT

                        name

                FROM

                        mydb

                WHERE

                       id = '1.1'

EOF

        $sth = $dbh->prepare($SQL);

        $sth->execute() or die $DBI::errstr;

        while(my @row = $sth->fetchrow_array) {

                printf "%s
\n", $row[0], $row[1];

        }


"Perl + Psql"
Отправлено alexeylomov , 10-Дек-04 14:08 
>попробуй примерно так
>
>        $SQL=<<EOF;
>
>            
>    SELECT
>
>            
>          
> name
>
>            
>    FROM
>
>            
>          
> mydb
>
>            
>    WHERE
>
>            
>          
>id = '1.1'
>
>EOF
>
>        $sth = $dbh->prepare($SQL);
>
>        $sth->execute() or die $DBI::errstr;
>
>        while(my @row = $sth->fetchrow_array) {
>
>            
>    printf "%s
>\n", $row[0], $row[1];
>
>        }

Да мне даже подконнектиться к базе не удаётся...
вот что я добавляю:
сначала
use DBI;
use DBD::Pg;
use strict;

my $dsn = mydb;
my $user = alex;
my $password = alex;

...затем уже в главной части
$dbh = DBI->connect( $dsn, $user, $password );
и всё, уже не пашет.
Так что SELECT мне ещё рано делать :)


"Perl + Psql"
Отправлено wersa , 10-Дек-04 14:41 
#!/usr/bin/perl -w

use strict;

use DBI;

$| = 1;

$SIG{INT} = \&onsig;

$SIG{KILL} = \&onsig;

$SIG{TERM} = \&onsig;

my $dbh;

&db_open;

сюда селект который я писал раньше

&db_close;

sub db_open() {

        my $user = 'юзер';

        my $password = 'пароль';

        my $database = 'ДБ';

        my $hostname = 'бля.ru';

        my $port = 3306;

        my $dsn =

"DBI:mysql:database=$database;host=$hostname;port=$port";

        $dbh = DBI->connect($dsn, $user, $password) or die

$DBI::errstr;

}

sub db_close() {

        ($dbh->disconnect or die $DBI::errstr) if $dbh;

}

sub onsig() {

        my $sig = shift;

        print "\nSIG $sig cathed - exiting!\n";

        &sa_close();

        exit 1;

}


"Perl + Psql"
Отправлено alexeylomov , 10-Дек-04 14:48 
Да при чём тут mysql.
Ведь ясно написано, что у меня Postgresql

"Perl + Psql"
Отправлено Simps , 10-Дек-04 15:52 
>Да при чём тут mysql.
>Ведь ясно написано, что у меня Postgresql
Очень похоже на капризный тон и отключение мозга ...

http://www.opennet.me/base/dev/postgres_notes.txt.html


"Perl + Psql"
Отправлено wersa , 10-Дек-04 16:51 
>Да при чём тут mysql.
>Ведь ясно написано, что у меня Postgresql

пример тебе дал там сам смотри.

проверь доходит ли запрос до сервера на котором БД.
не смотри скептически на следующую фразу, но все таки проверь пароль.


"Perl + Psql"
Отправлено alexeylomov , 10-Дек-04 17:10 
>>Да при чём тут mysql.
>>Ведь ясно написано, что у меня Postgresql
>
>пример тебе дал там сам смотри.
>
>проверь доходит ли запрос до сервера на котором БД.
>не смотри скептически на следующую фразу, но все таки проверь пароль.


В натуре, пароль не проходит :(
Всё 1000 раз проверил, всё правильно пишу, но он пишет
FATAL:  Password authentication failed for user "alex"


"Perl + Psql"
Отправлено alexeylomov , 10-Дек-04 17:37 
Кто-нибудь может подсказать, в чём могут быть грабли?
Захожу
#psql -U mydb alex
Password: alex
Всё ок.
А пишу в скрипте
Сначала в главном скрипте
$ENV{DBNAME}.="mydb";
$ENV{RDBUSER}.="alex";
$ENV{RPASSWD}.="alex";
Затем в том, где читается база
my $dbname = $ENV{"DBNAME"};
my $dbuser = $ENV{"RDBUSER"};
my $dbpass = $ENV{"RPASSWD"};
$db =DBI->connect("dbi:Pg:dbname=$dbname",$dbuser,$dbpass, $options)or die "Error in connecting in DataBase";
В ответ получаю
DBI->connect(dbname=mydb) failed: FATAL:  Password authentication failed for user "alex"

"Perl + Psql"
Отправлено XMan , 10-Дек-04 18:12 
Загляни в потгресовский pg_hba.conf на предмет разрешения заходов по сети с твоей машины. Возможно, там построено не пускать.

PS. В RH-сиситемах он валяется в /var/lib/pgsql/data


"Perl + Psql"
Отправлено alexeylomov , 12-Дек-04 15:12 
>Загляни в потгресовский pg_hba.conf на предмет разрешения заходов по сети с твоей
>машины. Возможно, там построено не пускать.
>
>PS. В RH-сиситемах он валяется в /var/lib/pgsql/data


Этого не может быть.
База находится на той же машине, что и я со своими скриптами.

PS: у меня debian.


"Perl + Psql"
Отправлено XMan , 12-Дек-04 23:24 
Это может быть. По умолчанию разрешено заходить только по unix-сокету, которым и пользуется консоль psql. Причем, аутентификация ident, то есть логин пользователя базы данных должно совпадать с системным логином.

Так же по умолчанию построен запрет на TCP-подключения, чем пользуются все, в том числе и DBD::Pg. Судя по сообщению, слушать TCP у тебя разрешены, но не факт, что разрешено заходить с localhost с указанным именем.


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


"Perl + Psql"
Отправлено alexeylomov , 13-Дек-04 14:37 
>Это может быть. По умолчанию разрешено заходить только по unix-сокету, которым и
>пользуется консоль psql. Причем, аутентификация ident, то есть логин пользователя базы
>данных должно совпадать с системным логином.
>
>Так же по умолчанию построен запрет на TCP-подключения, чем пользуются все, в
>том числе и DBD::Pg. Судя по сообщению, слушать TCP у тебя
>разрешены, но не факт, что разрешено заходить с localhost с указанным
>именем.
>
>
>Еще возможен вариант, когда у тебя новый постгрес и старый драйвер в
>перле. Но с такой несовместимостью я не сталкивался уже очень давно.
>

Проверил, насколько я понимаю тут всё разрешено.

# TYPE  DATABASE    USER        IP-ADDRESS        IP-MASK           METHOD
local             all                all                                                                      trust
host             all                all              127.0.0.1         255.255.255.255     trust

Ладно, буду тогда баги искать, может я ошибся где-нибудь или опечатался...


"Perl + Psql"
Отправлено mthawk , 19-Дек-04 17:22 
>Здравствуйте. Есть база данных mydb. Там есть таблица mytable.
>В которой есть столбцы name и id. По id мне нужно достать
>name.
>Ручками это выглядит так:
>mydb=# SELECT name FROM mytable WHERE id = '1.1';
>А сейчас потребовалось доставать это имя скриптом на перле.
>В умной книжке нашёл только описание как это сделать используя
>модуль pgsql_perl5, но использовать этот модуль у меня нет возможности.
>Подскажите, пожалуйста, как мне это сделать, или дайте ссылку, где можно
>найти решение. Спасибо.


#!/usr/bin/perl
use DBI;
$dbh = DBI->connect("dbi:Pg:dbname=$DBNAME; host=$HOST", $USER, $PASSWD) or die "Cannot connect $DBNAME on $HOST:$!";
$get=$dbh->prepare("SELECT name FROM mytable WHERE id = '1.1'");
$get->execute;
$name=$get->fetchrow; #если возвращается одна строка.
print "$name\n";
---------------------------
while(($name,$еще-что-то,$и_еще_что_то)=$get->fetchrow)
      {
       print "$name,$еще-что-то,$и_еще_что_то\n";
      }
#если возвращается несколько строк.