2015-10-29 71 views
0

MySQL的新品牌,我试图写一个Perl脚本来访问我自己的机器上的MySQL数据库(最终希望使用脚本从SQL Server数据库复制数据一台远程机器到我自己机器上的MySQL数据库,但首先我需要让它访问我的服务器)。访问MySQL数据库使用Perl DBD:ODBC

我写了下面的代码,在MySQL Workbench中正常工作:

use test; 

DROPTABLE IF EXISTS alerts; 

请不是我写DROPTABLE作为一个词在这里是因为我把它写成2个字计算器不会让我将它张贴和而不是给我一个错误。在实际的代码中,它是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 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.

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

(此外,如果有人知道真的将数据从远程SQL Server复制到本地MySQL数据库的绝佳方式,随时恭候您。现在,我想到的最好的办法是使用Perl从远程计算机中提取数据,然后将其推送到本地数据库,希望我可以在一个快速脚本中完成)

+0

_此外,如果有人知道将数据从远程SQL Server复制到本地MySQL数据库的一种非常好的方法,请随时发一声._你的意思就像'mysqldump'和'mysql'?请参阅:[将数据库从一台服务器复制到另一台](https://dev.mysql.com/doc/refman/5.5/en/mysqldump-copying-to-other-server.html) –

回答

1

您不能使用DBI一次执行多个SQL语句,所以你需要一个呼吁DROP TABLE,另一个用于CREATE TABLE

你说你的错误消息说,语法错误是

near 'column VARCHAR{17))'

和明显的解决方案是将开括号更改为一个左括号

+0

Re“你不能使用DBI一次执行多个SQL语句”,这是特定于驱动程序的,它看起来像这些驱动程序允许它(从它允许使用测试;在第二个语句之前)。 – ikegami

+0

谢谢,我没有意识到你必须单独调用每个使用DBI的语句。 Amatuer错误。我改变了它,因此每个语句都有一个单独的调用,现在它可以工作。 (不知道为什么大括号在那里,而不是括号。哎呀。) – Compysaurus

2

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));" 
+0

对不起,DROPTABLE是我的一个错误。当我试图用分隔的文字上传评论给SO时,我收到了一个错误,并且不会让我发布这个问题。解决这个问题的唯一方法就是让它成为一个词。我以为我已经添加了一句话来解释,但我想我已经把它排除了。 不知道是什么问题,因为当我试图发表此评论时,它给了我同样的“发生错误”警告。但它显然不是什么东西,因为你在答案中发布了它很好。 – Compysaurus