1. 程式人生 > >Python執行sql指令碼時GO語句報錯

Python執行sql指令碼時GO語句報錯

 在使用Python中的pymssql庫執行如下格式的sql指令碼時:

SELECT .....
GO

INSERT INTO ...
GO

報錯,錯誤資訊如下: 

(102, b"Incorrect syntax near 'GO'.DB-Lib error message 20018, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 20018, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 20018, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 20018, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\n")

關鍵詞GO其實是一個分批處理的意思,每個被GO分隔的語句都是一個單獨的事務,也就是說一個語句執行失敗不會影響其它語句執行。但是在 pymssql中執行如下插入操作時,execute()一次只能處理單次事務,GO對於這裡的execute()來說是無法識別的關鍵詞,故語法報錯。

conn = pymssql.connect(host=config['host'], user=config['user'], password=config['password'],database=config['database'], port=config['port'])
cur = conn.cursor()
try:
	cur.execute(sql)
	conn.commit()
except Exception as e:
	print(e)
	conn.rollback()
cur.close()
conn.close()

 解決方案:

1. 指令碼中刪除 GO ,再執行即可。(嗯,看上去很直接,很省事,就是方法顯得有點不負責任~)

2. 利用python中的sqlcmd執行sql指令碼(windows環境)

import os
file_name='test.sql'
os.system("sqlcmd -S localhost -U sa -P 123456 -d DB_Name -i "+"\""+file_name+"\"" ) 

其他的引數,可以通過輸入命令:sqlcmd /?  檢視