使用 Perl DBD:ODBC 访问 MySQL 数据库
Accessing MySQL database using Perl DBD:ODBC
MySQL 的新手,我正在尝试编写一个 Perl 脚本来访问我自己机器上的 MySQL 数据库(最终希望使用该脚本从 SQL 远程机器上的服务器数据库到我自己机器上的 MySQL 数据库,但首先我需要获取它才能访问我的服务器)。
我写了下面的代码,在 MySQL Workbench 中运行良好:
use test;
DROPTABLE IF EXISTS alerts;
请注意,我在这里将 DROPTABLE 写成一个单词,因为当我将它写成两个单词时,Whosebug 不会让我 post 它而是给我一个错误。在实际代码中是 2 个字。如果有人可以编辑这个问题使其成为 2 个单词,请这样做,但是当我尝试编辑它时,我得到了与 posting 时相同的错误。
CREATE TABLE alerts (
alertid INT NOT NULL,
alertdttm DATE NOT NULL,
alerttype VARCHAR(256) NOT NULL,
userid INT NOT NULL,
alerttext VARCHAR(1024) NULL
);
但是,当我使用以下 Perl 脚本时出现错误:
$sql_my = <<'END_SQLmy';
use test;
DROPTABLE IF EXISTS alerts;
CREATE TABLE alerts (
alertid INT NOT NULL,
alertdttm DATE NOT NULL,
alerttype VARCHAR(256) NOT NULL,
userid INT NOT NULL,
alerttext VARCHAR(1024) NULL
);
END_SQLmy
$dbh2 = DBI->connect( "dbi:ODBC:MySQL57") || die "Cannot connect: $DBI::errstr";
print "Connecting to MySQL database.\n";
$sth2 = $dbh2->prepare($sql_my);
$sth2->execute;
DBD::ODBC::st execute failed: [MySQL][ODBC 5.3(w) Driver][mysqld-5.7.9-log]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DROPTABLE IF EXISTS alerts;
我试了一下代码并将其更改为
my $table = "alerts1";
$dbh2 = DBI->connect($dsn, $user, $pw);
$dbh2->do("CREATE TABLE $table (column VARCHAR(17));");
$dbh2->disconnect;
连接也很好,但是 CREATE TABLE 行给我一个错误,
BDB::mysql::db do failed: You have an error in your SQL syntax; check the manual the corresponds to your MySQL server version for the right syntax to use near 'column VARCHAR{17))' at line 1 at testmysql.pl line 51.
所以我认为这就是我的语法错误的来源,但我不知道如何修复它。我检查了用户的权限,它似乎具有正确的权限,并且它很好地删除了 table,但它无法创建它。但是,当我在 MySQL Workbench 中 运行 相同的查询时,它会创建 table,所以我知道语法没问题。知道问题是什么吗? (仅供参考,我使用 MySQL 5.3 unicode 驱动程序使用本地主机、端口 3306 以及根用户和密码设置了 ODBC。我在 Windows 7 机器上。)
(此外,如果有人知道将数据从远程 SQL 服务器复制到本地 MySQL 数据库的真正好方法,请随意插话。现在最好的主意是我我想到的是用 Perl 从远程机器中提取数据,然后将其推送到本地数据库,希望我可以在一个快速脚本中完成。)
You have an error in your SQL syntax; [...] near 'DROPTABLE IF EXISTS alerts;
如错误所述,您的 SQL 无效。
DROPTABLE IF EXISTS alerts;
应该是
DROP TABLE IF EXISTS alerts;
^
You have an error in your SQL syntax; [...] near 'column VARCHAR{17))'
同样,
"CREATE TABLE $table (column VARCHAR{17));"
应该是
"CREATE TABLE $table (column VARCHAR(17));"
^
其实应该是
"CREATE TABLE ".$dbh->quote_identifier($table)." (column VARCHAR(17));"
您不能使用 DBI 一次执行多个 SQL 语句,因此您需要一次调用 DROP TABLE
,一次调用 CREATE TABLE
你说你的错误信息说语法错误是
near 'column VARCHAR{17))'
显而易见的解决方案是将左大括号更改为左括号
MySQL 的新手,我正在尝试编写一个 Perl 脚本来访问我自己机器上的 MySQL 数据库(最终希望使用该脚本从 SQL 远程机器上的服务器数据库到我自己机器上的 MySQL 数据库,但首先我需要获取它才能访问我的服务器)。
我写了下面的代码,在 MySQL Workbench 中运行良好:
use test;
DROPTABLE IF EXISTS alerts;
请注意,我在这里将 DROPTABLE 写成一个单词,因为当我将它写成两个单词时,Whosebug 不会让我 post 它而是给我一个错误。在实际代码中是 2 个字。如果有人可以编辑这个问题使其成为 2 个单词,请这样做,但是当我尝试编辑它时,我得到了与 posting 时相同的错误。
CREATE TABLE alerts (
alertid INT NOT NULL,
alertdttm DATE NOT NULL,
alerttype VARCHAR(256) NOT NULL,
userid INT NOT NULL,
alerttext VARCHAR(1024) NULL
);
但是,当我使用以下 Perl 脚本时出现错误:
$sql_my = <<'END_SQLmy';
use test;
DROPTABLE IF EXISTS alerts;
CREATE TABLE alerts (
alertid INT NOT NULL,
alertdttm DATE NOT NULL,
alerttype VARCHAR(256) NOT NULL,
userid INT NOT NULL,
alerttext VARCHAR(1024) NULL
);
END_SQLmy
$dbh2 = DBI->connect( "dbi:ODBC:MySQL57") || die "Cannot connect: $DBI::errstr";
print "Connecting to MySQL database.\n";
$sth2 = $dbh2->prepare($sql_my);
$sth2->execute;
DBD::ODBC::st execute failed: [MySQL][ODBC 5.3(w) Driver][mysqld-5.7.9-log]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DROPTABLE IF EXISTS alerts;
我试了一下代码并将其更改为
my $table = "alerts1";
$dbh2 = DBI->connect($dsn, $user, $pw);
$dbh2->do("CREATE TABLE $table (column VARCHAR(17));");
$dbh2->disconnect;
连接也很好,但是 CREATE TABLE 行给我一个错误,
BDB::mysql::db do failed: You have an error in your SQL syntax; check the manual the corresponds to your MySQL server version for the right syntax to use near 'column VARCHAR{17))' at line 1 at testmysql.pl line 51.
所以我认为这就是我的语法错误的来源,但我不知道如何修复它。我检查了用户的权限,它似乎具有正确的权限,并且它很好地删除了 table,但它无法创建它。但是,当我在 MySQL Workbench 中 运行 相同的查询时,它会创建 table,所以我知道语法没问题。知道问题是什么吗? (仅供参考,我使用 MySQL 5.3 unicode 驱动程序使用本地主机、端口 3306 以及根用户和密码设置了 ODBC。我在 Windows 7 机器上。)
(此外,如果有人知道将数据从远程 SQL 服务器复制到本地 MySQL 数据库的真正好方法,请随意插话。现在最好的主意是我我想到的是用 Perl 从远程机器中提取数据,然后将其推送到本地数据库,希望我可以在一个快速脚本中完成。)
You have an error in your SQL syntax; [...] near 'DROPTABLE IF EXISTS alerts;
如错误所述,您的 SQL 无效。
DROPTABLE IF EXISTS alerts;
应该是
DROP TABLE IF EXISTS alerts;
^
You have an error in your SQL syntax; [...] near 'column VARCHAR{17))'
同样,
"CREATE TABLE $table (column VARCHAR{17));"
应该是
"CREATE TABLE $table (column VARCHAR(17));"
^
其实应该是
"CREATE TABLE ".$dbh->quote_identifier($table)." (column VARCHAR(17));"
您不能使用 DBI 一次执行多个 SQL 语句,因此您需要一次调用 DROP TABLE
,一次调用 CREATE TABLE
你说你的错误信息说语法错误是
near 'column VARCHAR{17))'
显而易见的解决方案是将左大括号更改为左括号