【问题标题】:Accessing MySQL database using Perl DBD:ODBC使用 Perl DBD:ODBC 访问 MySQL 数据库
【发布时间】:2015-10-30 01:12:33
【问题描述】:

全新的 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) Driver][mysqld-5.7.9-log]您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在“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: 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 testmysql.pl 第 51 行的第 1 行的 'column VARCHAR{17))' 附近使用正确的语法。

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

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

【问题讨论】:

  • 另外,如果有人知道将数据从远程 SQL Server 复制到本地 MySQL 数据库的非常好的方法,请随时加入。 你的意思就像 @987654326 @ 和 mysql?见:Copy a database from one server to another

标签: mysql perl dbi


【解决方案1】:

您的 SQL 语法有错误; [...] 'DROPTABLE IF EXISTS alerts;

正如错误所说,您的 SQL 无效。

DROPTABLE IF EXISTS alerts;

应该是

DROP TABLE IF EXISTS alerts;
    ^

您的 SQL 语法有错误; [...] '列 VARCHAR{17))'

同样,

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

应该是

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

其实应该是的

"CREATE TABLE ".$dbh->quote_identifier($table)." (column VARCHAR(17));"

【讨论】:

  • 抱歉,DROPTABLE 是我的一个错误。当我尝试将评论上传到 SO 并分隔单词时,我收到一个错误,它不会让我发布问题。解决它的唯一方法是让它成为一个单词。我以为我添加了一个句子来解释这一点,但我想我把它遗漏了。不确定问题是什么,因为当我尝试发布此评论时,它给了我相同的“发生错误”警告。但这显然不是什么大问题,因为您在答案中发布得很好。
【解决方案2】:

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

你说你的错误信息说语法错误是

“列 VARCHAR{17))”附近

显而易见的解决方案是将左大括号更改为左括号

【讨论】:

  • 关于“你不能使用 DBI 一次执行多个 SQL 语句”,这是特定于驱动程序的,看起来这些驱动程序允许它(因为它允许 @987654323 @ 在第二个语句之前)。
  • 谢谢,我没有意识到您必须使用 DBI 为每个语句单独调用。业余错误。我改变了它,所以每个语句都有一个单独的调用,它现在可以工作了。 (不知道为什么用大括号代替括号。哎呀。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-12
  • 2013-05-03
  • 2017-09-02
  • 1970-01-01
  • 1970-01-01
  • 2017-10-24
  • 1970-01-01
相关资源
最近更新 更多