正常情況下寫的代碼:
conn = pymssql.connect(host='server', user="myname", password="123456?",database=DataBase_name)
cursor = conn.cursor() # 創建遊標
sql = "CREATE DATABASE Table_name"
cursor.execute(sql)
conn.commit()
conn.close()
按照正常的邏輯進行數據庫的連接報錯:
pymssql.OperationalError: (226, b'CREATE DATABASE statement not allowed within multi-statement transaction.DB-Lib error message 20018, severity 16:\nGeneral SQL Server error: Check messages from the SQL Server\n')
原因及解決方案:
pymssql庫規定對database 的操作必須是在autocommit爲Ture時進行。也就是在execute時就會立即向數據庫發出操作請求,而不是等待運行到commit()時再一起執行。
這樣做的目的是爲了保證對Table的新建/刪除/插入數據等操作,其位置定位是準確的,也就是說在執行Table操作時整個數據庫系統裏的所有database名稱都是固定的,不存在不確定的情況。
解決方案:
conn = pymssql.connect(host='server', user="myname", password="123456?")
cursor = conn.cursor() # 創建遊標
conn.autocommit(True) #指令立即執行,無需等待conn.commit()
sql = "CREATE DATABASE DataBase_name "
cursor.execute(sql)
conn.autocommit(False) #指令關閉立即執行,以後還是等待conn.commit()時再統一執行
conn.close()
參考資源來源:大佬