Perl - получить структуру базы данных sqlite, используя DBI - PullRequest
1 голос
/ 28 марта 2019

Мне нужно проверить структуру моей базы данных SQLite, которая составлена ​​из уникальной таблицы, скажем, с 2 столбцами (id, name). Я не могу понять запрос SQL, чтобы получить схему таблицы моей базы данных.

Я могу получить все содержимое базы данных, используя метод DBI selectall_arrayref(). Однако он возвращает только массив, содержащий значения в моей базе данных. Эта информация полезна, но я хотел бы иметь SQL-запрос, который возвращает что-то вроде id, name (в основном, схема таблицы).

Я пробовал следующие запросы: SHOW COLUMNS FROM $tablename, но также SELECT * from $tablename (этот возвращает все содержимое таблицы).

Вот моя реализация:

# database path
my $db_path   = "/my/path/to/.database.sqlite";
my $tablename = "table_name";

sub connect_to_database {

    # Connect to the database
    my $dbh = DBI->connect ("dbi:SQLite:dbname=$db_path", "", "",
                            { RaiseError => 1, AutoCommit => 0 },
                           )
    or confess $DBI::errstr;
    return $dbh;
}

sub get_database_structure {

    # Connect to the database
    my $dbh = &connect_to_database();

    # Get the structure of the database
    my $sth = $dbh->prepare("SHOW COLUMNS FROM $tablename");
    $sth->execute();
    while (my $inphash = $sth->fetrow_hashref()) {
        print $inphash."\n";
    }

    # Disconnect from the database
    $dbh->disconnect();
}

# Call the sub to print the database structure
&get_database_structure();

Я ожидаю, что вывод будет структурой моей таблицы, поэтому id, name но я выдаю ошибку: DBD::SQLite::db prepare failed: near "SHOW": syntax error

Я не могу найти хороший запрос. Любые комментарии или помощь будет принята с благодарностью.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 28 марта 2019

То, что вы ищете, - это просто SQL-запрос lite для информации о таблице и столбце. Этот ответ Метаданные с информацией о схеме SQLite содержит полную информацию, если этот запрос не работает для вас, но при условии, что вы используете «недавнюю» версию, упомянутую в одном из ответов, вы можете сделать что-то вроде этого:

# Get the structure of the database
my $sth = $dbh->prepare("<<END_SQL");
SELECT 
  m.name as table_name, 
  p.name as column_name
FROM sqlite_master AS m
JOIN pragma_table_info(m.name) AS p
ORDER BY m.name, p.cid
END_SQL
$sth->execute();
my $last = '';
while (my $row = $sth->fetchrow_arrayref()) {
    my ($table, $column) = @$row;
    if ($table ne $last) {
        print "=== $table ===\n";
        $last = $table;
    }
    print "$column\n";
}
1 голос
/ 28 марта 2019

После поиска ответов сообщества я наконец-то нашел решение, используя прагму table_info.

sub get_database_structure {

    # Connect to the database
    my $dbh = &connect_to_database ();

    # Return the structure of the table execution_host
    my $sth = $dbh->prepare('pragma table_info(execution_host)');
    $sth->execute();
    my @struct;
    while (my $row = $sth->fetchrow_arrayref()) {
        push @struct, @$row[1];
    }

    # Disconnect from the database
    $dbh->disconnect ();

    return @struct;
}

Возвращает список имен столбцов, представленных в таблице execute_host.

Спасибо за помощь!

...