Выполнить файл SQL в Perl - PullRequest
       1

Выполнить файл SQL в Perl

5 голосов
/ 18 ноября 2010

У нас есть Perl-скрипт, который запускает SQL и помещает данные в таблицу. Теперь вместо того, чтобы предоставлять один оператор SQL, мы хотим передать кучу из них, собрав их в файл .sql. Мы знаем, что наша программа потерпит неудачу, потому что она ожидает один SQL-оператор, а не несколько из них (это тоже из файла .sql). Как заставить его работать с файлом .sql (с несколькими операторами INSERT?). Мы используем пакет DBI.

Небольшой фрагмент кода:

$sth = $dbh->prepare("/home/user1/tools/mytest.sql");
$sth->execute || warn "Couldn't execute statement";
$sth->finish();

Ответы [ 4 ]

4 голосов
/ 23 апреля 2014

Существует своего рода обходной путь для DDL.Сначала нужно набросать файл SQL, а затем заключить его содержимое в ключевые слова BEGIN ... END;.Например:

sub exec_sql_file {
    my ($dbh, $file) = @_;

    my $sql = do {
        open my $fh, '<', $file or die "Can't open $file: $!";
        local $/;
        <$fh>
    };

    $dbh->do("BEGIN $sql END;");
}

Эта подпрограмма позволяет запускать сценарии DDL (SQL) с несколькими операторами внутри (например, дампами базы данных).

4 голосов
/ 19 ноября 2010

Не совсем уверен, что вы хотите ...

После создания объекта DBI вы можете использовать его снова и снова.Здесь я читаю инструкцию SQL после инструкции SQL из файла и обрабатываю все по порядку:

use DBI;

my $sqlFile = "/home/user1/tools/mytest.sql"

my $dbh = DBI::Connect->new($connect, $user, $password)
    or die("Can't access db");

# Open the file that contains the various SQL statements
# Assuming one SQL statement per line

open (SQL, "$sqlFile")
    or die("Can't open file $sqlFile for reading");

# Loop though the SQL file and execute each and every one.
while (my $sqlStatement = <SQL>) {
   $sth = dbi->prepare($sqlStatement)
      or die("Can't prepare $sqlStatement");

   $sth->execute()
      or die("Can't execute $sqlStatement");
}

Обратите внимание, что я ставлю инструкцию SQL в prepare, а не в имени файлакоторый содержит инструкцию SQL.Может ли это быть вашей проблемой?

4 голосов
/ 18 ноября 2010

Вам не нужен Perl для этого вообще. Просто используйте клиент командной строки mysql:

mysql -h [hostname] -u[username] -p[password] [database name] < /home/user1/tools/mytest.sql

замените [переменные] вашей информацией.

Примечание без пробела после -u или -p. Если ваш сервер MySQL работает на той же машине, вы можете опустить -h [hostname] (по умолчанию это localhost)

1 голос
/ 10 февраля 2012

Вот как я это сделал.В моем случае я не предполагаю один SQL на строку, и я предполагаю, мой пример немного лучше:)

sub get_sql_from_file {
    open my $fh, '<', shift or die "Can't open SQL File for reading: $!";
    local $/;
    return <$fh>;
};

my $SQL = get_sql_from_file("SQL/file_which_holds_sql_statements.sql");
my $sth1 = $dbh1->prepare($SQL);
$sth1->execute();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...