2011-03-02 28 views
1

作爲工件交付的一部分,我們的開發人員將.sql文件中的數據和結構腳本提供給用戶。我通常「雙擊」這些文件以在「Microsoft SQL Server Management Studio」中打開。管理工作室會提示我輸入數據庫服務器和用戶/密碼。我手動輸入它們並點擊Execute按鈕來執行這些腳本。執行用於在Python中的SQL Management Studio中運行的.sql文件

這些腳本包含結構和數據sql命令。每個腳本可能包含多個數據命令(如選擇,插入,更新等)。結構和數據腳本在單獨的.sql文件中提供。

這些腳本還包含存儲過程和函數等,它們還包含註釋/說明。

我想通過python自動執行這些腳本。我看着pyodbc和pymssql,但他們不像解決我的問題。 通過pyodbc,我需要讀取每個.sql文件並讀取sql命令並逐一執行它們。由於文件可能有評論/說明/ SP /等,閱讀文件將不會有多大困難。

任何人都可以提供關於如何自動化的建議嗎?

在此先感謝。

+1

我已經做了幾次,我發現的唯一方法是將SQL文件拆分成離散的語句,可悲的是。 – dfb 2011-03-02 22:25:39

回答

4

您可以使用sqlcmd運行它們。 Sqlcmd是一個命令行實用程序,可讓您從命令行運行.sql腳本,我相信您可以通過python啓動腳本。

+2

它還允許您在部署到多個環境時指定連接參數和腳本變量。 – 2011-03-03 00:09:55

1

如果該文件對於內存不太大,則可以使用此代碼對其進行解析並使用pymssql運行每條語句。

只要在行末找到GO行或;就會執行。

_conn = pymssql.connect(** connection settings **) 
    _cur = _conn.cursor() 
    with open(filename, 'r') as f: 
     script = f.read().decode('utf-8') # or whatever its encoding is 
    script = re.sub(r'\/\*.*?\*\/', '', script, flags=re.DOTALL) # remove multiline comment 
    script = re.sub(r'--.*$', '', script, flags=re.MULTILINE) # remove single line comment 

    sql = [] 
    do_execute = False 
    for line in script.split(u'\n'): 
     line = line.strip() 
     if not line: 
      continue 
     elif line.upper() == u'GO': 
      do_execute = True 
     else: 
      sql.append(line) 
      do_execute = line.endswith(u';') 

     if do_execute and filter(None, sql): # ignore if only blank lines 
      cursor.execute(u'\n'.join(sql).encode("cp1252")) # I have experienced problems when executing utf-8 
      do_execute = False 
      sql = [] 

    _conn.close() 
相關問題