Как получить список результатов, если sqlite возвращает более одной строки? - PullRequest
1 голос
/ 24 декабря 2009

вот так выглядит мой стол:

key | driver  | machine     | result
-----------------------------------
1   | 1234    | abc_machine | pass
2   | 1234    | xyz_machine | fail

, когда пользователь выбирает '1234' из драйвера, и все из машины становится немного грязным. (пользователь делает выбор из графического интерфейса)

когда я делаю:

$getConfig = `sqlite3 abc.db "SELECT machine FROM $table_name WHERE driver='$drvrSel'"`;

это дает мне abc_machine xyz_machine.

Я пытался разделить их, используя split(/ /, $getConfig), но не работает.

Спасибо.

Извините, если я задал этот вопрос не в том месте. Я пытался найти правильное место, но не смог его найти.

Ответы [ 5 ]

5 голосов
/ 24 декабря 2009
#!/usr/bin/perl

use DBI;
use strict;

my $dbargs = {AutoCommit => 0, PrintError => 1};

my $dbh = DBI->connect("dbi:SQLite:dbname=test.db","","",$dbargs);
my $sth = $dbh->prepare("SELECT machine FROM test WHERE driver = 1234");
$sth->execute();

my @data;

while (@data = $sth->fetchrow_array()) {
    print $data[0] . "\n";
}

$sth->finish;
$dbh->disconnect;
2 голосов
/ 24 декабря 2009

Вместо вызова программы SQLite вы должны использовать DBI .

Кстати:

perl -MData::Dumper -e '$_="abc_machine xyz_machine";print Dumper split / /;'

$ VAR1 = 'abc_machine';
$ VAR2 = 'xyz_machine';

Итак, еще раз проверьте данные, содержащиеся в $getConfig.

0 голосов
/ 24 декабря 2009

хорошо, ребята, я нашел это ...

\ W соответствует любому не-словесному символу

`@setConfig = split(/\W/, $getConfig);`

это делит его на:

$ setConfig [0] = abc_machine $ setConfig [1] = xyz_machine

спасибо всем.

0 голосов
/ 24 декабря 2009

На самом деле sqlite3 поддерживает две опции командной строки, которые могут быть вам полезны: -list (разделитель '|') и -csv для файла csv. Смотрите man-страницу для sqlite3 для деталей. Затем вы можете разделить разделитель или использовать Text :: CSV_XS для разделения отдельных полей

Следуя комментарию Рашидса ниже, я явно неправильно понял ваш вопрос. Виноват. Вот один из способов сделать это:

my $result = `sqlite3 dbname "query"`;
$result =~ s/\n/ /gs;
0 голосов
/ 24 декабря 2009

Там может быть скрытая вкладка или символ новой строки. Посмотрите на значение ascii пустого символа между строками и используйте его в вашем вызове split.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...