正常情况下写的代码:
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()
参考资源来源:大佬