2015-10-29 72 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