使用Perl DBD访问MySQL数据库:ODBC

时间:2015-10-29 15:00:24

标签: mysql perl dbi

全新的MySQL,我正在尝试编写一个Perl脚本来访问我自己机器上的MySQL数据库(最终希望使用该脚本将数据从远程机器上的SQL Server数据库复制到MySQL数据库上我自己的机器,但首先我需要让它访问我的服务器)。

我编写了以下代码,它在MySQL Workbench中运行良好:

use test;

DROPTABLE IF EXISTS alerts;

请注意,我在这里写了一个单词DROPTABLE,因为当我把它写成2个单词时,stackoverflow不会让我发布它并给我一个错误。在实际代码中它是2个单词。如果任何人都可以编辑这个问题,请将其设为2个字,但是当我尝试编辑时,我得到了同样的错误。

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执行失败:[MySQL] [ODBC 5.3(w)驱动程序] [mysqld-5.7.9-log] SQL语法中有错误;检查与您的MySQL服务器版本相对应的手册,以便在'DROPTABLE IF EXISTS警报附近'使用正确的语法;

我玩了代码并将其更改为

my $table = "alerts1";
$dbh2 = DBI->connect($dsn, $user, $pw);
$dbh2->do("CREATE TABLE $table (column VARCHAR(17));"); 
$dbh2->disconnect;

哪个也很好连接,但是给我一个CREATE TABLE行的错误,

  

BDB :: mysql :: db失败:您的SQL语法出错;检查与MySQL服务器版本对应的手册,以便在testmysql.pl第51行第1行的“column VARCHAR {17)”附近使用正确的语法。

所以我认为这是我的语法错误来自哪里,但我无法弄清楚如何解决它。我检查了用户的权限,它似乎有正确的权限,它删除表很好,但它无法创建它。当我在MySQL Workbench中运行相同的查询时,它创建了表,所以我知道语法没问题。知道问题是什么吗? (仅供参考我使用MySQL 5.3 unicode驱动程序设置ODBC with localhost,端口3306以及root用户和密码。我在Windows 7计算机上。)

(另外,如果有人知道将数据从远程SQL Server复制到本地MySQL数据库的一种非常好的方法,请随意插入。现在我想出的最好的想法是从中提取数据使用Perl远程机器,然后将其推送到本地数据库,希望我能用一个快速脚本完成。)

2 个答案:

答案 0 :(得分:2)

  

您的SQL语法有错误; [...]如果EXISTS警告附近可以摧毁;

如错误所示,您的SQL无效。

$AssetTypesOptions = getListFromDB('AssetTypes', $Role);

应该是

DROPTABLE IF EXISTS alerts;
  

您的SQL语法有错误; [...]附近的列VARCHAR {17))&#39;

类似地,

DROP TABLE IF EXISTS alerts;
    ^

应该是

"CREATE TABLE $table (column VARCHAR{17));"

实际上,它应该是

"CREATE TABLE $table (column VARCHAR(17));"
                                    ^

答案 1 :(得分:1)

您不能使用DBI一次执行多个SQL语句,因此您需要一次调用DROP TABLE而另一个调用CREATE TABLE

您说您的错误消息显示语法错误

  

near&#39; column VARCHAR {17))&#39;

显而易见的解决办法是将左大括号改为左括号