Здравствуйте. Есть база данных mydb. Там есть таблица mytable.
В которой есть столбцы name и id. По id мне нужно достать name.
Ручками это выглядит так:
mydb=# SELECT name FROM mytable WHERE id = '1.1';
А сейчас потребовалось доставать это имя скриптом на перле.
В умной книжке нашёл только описание как это сделать используя
модуль pgsql_perl5, но использовать этот модуль у меня нет возможности.
Подскажите, пожалуйста, как мне это сделать, или дайте ссылку, где можно
найти решение. Спасибо.
Все смотрят в сторону модулей DBI и DBD::MySQL.
Будешь пользовать DBI - забудешь о переписывании скрипта под разные серверы. Он для того и сделан.
попробуй примерно так$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];}
>попробуй примерно так
>
> $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 мне ещё рано делать :)
#!/usr/bin/perl -wuse 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;
}
Да при чём тут mysql.
Ведь ясно написано, что у меня Postgresql
>Да при чём тут mysql.
>Ведь ясно написано, что у меня Postgresql
Очень похоже на капризный тон и отключение мозга ...
>Да при чём тут mysql.
>Ведь ясно написано, что у меня Postgresqlпример тебе дал там сам смотри.
проверь доходит ли запрос до сервера на котором БД.
не смотри скептически на следующую фразу, но все таки проверь пароль.
>>Да при чём тут mysql.
>>Ведь ясно написано, что у меня Postgresql
>
>пример тебе дал там сам смотри.
>
>проверь доходит ли запрос до сервера на котором БД.
>не смотри скептически на следующую фразу, но все таки проверь пароль.
В натуре, пароль не проходит :(
Всё 1000 раз проверил, всё правильно пишу, но он пишет
FATAL: Password authentication failed for user "alex"
Кто-нибудь может подсказать, в чём могут быть грабли?
Захожу
#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"
Загляни в потгресовский pg_hba.conf на предмет разрешения заходов по сети с твоей машины. Возможно, там построено не пускать.PS. В RH-сиситемах он валяется в /var/lib/pgsql/data
>Загляни в потгресовский pg_hba.conf на предмет разрешения заходов по сети с твоей
>машины. Возможно, там построено не пускать.
>
>PS. В RH-сиситемах он валяется в /var/lib/pgsql/data
Этого не может быть.
База находится на той же машине, что и я со своими скриптами.PS: у меня debian.
Это может быть. По умолчанию разрешено заходить только по unix-сокету, которым и пользуется консоль psql. Причем, аутентификация ident, то есть логин пользователя базы данных должно совпадать с системным логином.Так же по умолчанию построен запрет на TCP-подключения, чем пользуются все, в том числе и DBD::Pg. Судя по сообщению, слушать TCP у тебя разрешены, но не факт, что разрешено заходить с localhost с указанным именем.
Еще возможен вариант, когда у тебя новый постгрес и старый драйвер в перле. Но с такой несовместимостью я не сталкивался уже очень давно.
>Это может быть. По умолчанию разрешено заходить только по 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Ладно, буду тогда баги искать, может я ошибся где-нибудь или опечатался...
>Здравствуйте. Есть база данных 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";
}
#если возвращается несколько строк.