如何从 perl 脚本加载 .sql 文件并在 perl 脚本中执行 sql 命令
How to load the .sql file from perl script and execute the sql commands in the perl script
我必须在 perl 脚本中加载 SQL 文件并执行 SQL 命令并仅在 perl 文件中显示输出。
场景:
test1.sql 文件包含 SQL 这种格式的命令
CREATE TABLE Persons
(
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
现在我想在不使用文件的情况下加载 test1.sql 并执行此 SQL
并且还在 Perl 脚本中显示输出,例如 table created
如果我没看错你的问题,你最大的挑战是将文件分解成单独的 sql 语句,SQL::SplitStatement 很有用,但要注意它不是防弹的。
这是一个如何完成此操作的示例;
#!/usr/bin/env perl
use strict;
use warnings;
use diagnostics;
use DBI;
use File::Slurp;
use SQL::SplitStatement;
my $sql_blob = read_file( 'test1.sql' ) ;
my @sql_list = SQL::SplitStatement->new()->split($sql_blob);
my $dbh = DBI->connect( "dbi:mysql:my_database:localhost:3306", "username", "password" );
foreach my $sql (@sql_list) {
print 'Executing ', $sql;
$dbh->do($sql) or print "Can't do ", $dbh->errstr;
}
CPAN 模块 DBIx::RunSQL 可能有帮助:
use strict;
use warnings;
use DBIx::RunSQL;
my $test_dbh = DBIx::RunSQL->create(
dsn => 'dbi:SQLite:dbname=:memory:',
sql => 'test1.sql',
force => 1,
verbose => 1,
);
根据需要更改 DBI dsn(同时添加 user
和 password
参数)
我必须在 perl 脚本中加载 SQL 文件并执行 SQL 命令并仅在 perl 文件中显示输出。
场景: test1.sql 文件包含 SQL 这种格式的命令
CREATE TABLE Persons
(
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
现在我想在不使用文件的情况下加载 test1.sql 并执行此 SQL 并且还在 Perl 脚本中显示输出,例如 table created
如果我没看错你的问题,你最大的挑战是将文件分解成单独的 sql 语句,SQL::SplitStatement 很有用,但要注意它不是防弹的。
这是一个如何完成此操作的示例;
#!/usr/bin/env perl
use strict;
use warnings;
use diagnostics;
use DBI;
use File::Slurp;
use SQL::SplitStatement;
my $sql_blob = read_file( 'test1.sql' ) ;
my @sql_list = SQL::SplitStatement->new()->split($sql_blob);
my $dbh = DBI->connect( "dbi:mysql:my_database:localhost:3306", "username", "password" );
foreach my $sql (@sql_list) {
print 'Executing ', $sql;
$dbh->do($sql) or print "Can't do ", $dbh->errstr;
}
CPAN 模块 DBIx::RunSQL 可能有帮助:
use strict;
use warnings;
use DBIx::RunSQL;
my $test_dbh = DBIx::RunSQL->create(
dsn => 'dbi:SQLite:dbname=:memory:',
sql => 'test1.sql',
force => 1,
verbose => 1,
);
根据需要更改 DBI dsn(同时添加 user
和 password
参数)