2009-12-19 53 views
5

工作,我有以下幾行代碼:無法獲得MySQL源代碼查詢使用Python MySQLdb的模塊

sql = "source C:\\My Dropbox\\workspace\\projects\\hosted_inv\\create_site_db.sql" 
cursor.execute (sql) 

當我執行我的計劃,我得到以下錯誤:

Error 1064: 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 'source C:\My Dropbox\workspace\projects\hosted_inv\create_site_db.sql' at line 1

現在我可以將以下內容複製到mysql中作爲查詢:

source C:\\My Dropbox\\workspace\\projects\\hosted_inv\\create_site_db.sql 

它的工作原理非常完美。當我檢查查詢日誌通過我的腳本執行的查詢,它表明我的查詢語句如下:

source C:\\My Dropbox\\workspace\\projects\\hosted_inv\\create_site_db.sql 

然而,當我手動粘貼在與執行,整個create_site_db.sql獲取擴展查詢日誌,並顯示該文件中的所有sql查詢。

我在這裏失去了一些東西就MySQLdb的如何做查詢?我是否遇到了限制?我的目標是運行一個sql腳本來創建模式結構,但我不想在shell進程中調用mysql來獲取sql文件。

有什麼想法?謝謝!

回答

12

正如有人說,你不能在MySQLdb的Python的API

那麼使用命令source,而不是運行,加載該文件,並執行它

比方說你的.sql文件有

create database test; 

念想

sql=open("test.sql").read() 

的內容d然後執行它

cursor.execute(sql); 

您將獲得新的數據庫「測試」

+0

非常感謝! sql = open(「test.sql」)。read()正是我想要的。我想避免分支shell進程,因爲它不僅沒有必要,而且還會依賴於我執行的系統上安裝的mysql客戶端二進制文件。 感謝大家的幫助! – Chris 2009-12-20 00:16:45

+0

不客氣的克里斯 – YOU 2009-12-20 05:34:41

3

「源」不是SQL命令,但MySQL命令行客戶機的內部命令。

7

source命令僅由MySQL命令行客戶識別的built-in commands之一。它不被支持爲可以通過任何API執行的語句。

有些人認爲您可以簡單地在「;」語句結束符處分割一個SQL腳本文件,並在您獲得的每一行上調用​​。但也有很多例外情況:

  • 語句是built-in commandsCONNECTSOURCECHARSETWARNINGSQUIT
  • 注意,內置命令不需要;終止例如DELIMITER 。包含;但不能作爲終結,就像CREATE TRIGGER
  • 聲明。包含;內字符串文字或評論,甚至帶引號的標識符
  • 聲明。
  • 評論線。

要以編程方式加載SQL腳本,您必須複製mysql客戶端的大量功能。因此,最好是分叉一個進程,以腳本作爲輸入實際執行該客戶端程序。

參見:

1

我相信 「源」 命令是針對mysql外殼可執行文件 - 它不是一個sql命令並且不能被正確解釋n作爲sql語句執行。

爲了實現您的目標,您可能需要閱讀腳本文件並將其解析爲單個的sql語句,然後使用您的遊標一次執行它們。

2

我遇到了同樣的問題!

作爲解決方案,我安裝了庫sqlparse並使用了sqlparse.split(sql)結果。我必須檢查sql_parts是否包含空行作爲獨奏語句......否則「WOW」sqlparse非常好,正是我所需要的!

import sqlparse 
.... 
sql = open("test.sql").read() 
sql_parts = sqlparse.split(sql) 
for sql_part in sql_parts: 
    if sql_part.strip() == '': 
     continue 
    cursor.execute(sql_part) 

FYI:如果你不運行每條語句自身您可能會收到錯誤「命令不同步,你現在不能運行此命令」。在我向sql文件添加更多查詢之後,我只有這個錯誤 - 不是第一次。

+0

爲便利的FYI +1。 – 2010-09-15 03:33:06

+0

是不是sql_part.strip(),而不是替換位? – ssc 2010-10-20 05:13:02

+0

是的,我想帶會更好,更便攜(更新後)。 – Rescommunes 2010-10-30 21:46:18

相關問題