我使用MS SQL express数据库。我可以连接并获取数据。但插入数据不起作用:
cursor.execute("insert into [mydb].[dbo].[ConvertToolLog] ([Message]) values('test')")
我没有收到任何错误,但表中没有插入任何内容。在我获取数据之后,插入的行将被直接获取。但什么都救不了。
在MS SQL Server Management Studio中,插入确实有效。
您需要提交数据。每个SQL命令都在一个事务中,必须提交该事务才能将该事务写入SQL Server,以便其他SQL命令可以读取该事务。
在MS SQL Server Management Studio下,默认情况是允许自动提交,这意味着每个SQL命令都能立即工作,并且不能回滚。
示例来自pyodbc入门文档
首先打开数据库并设置光标
import pyodbc
# Specifying the ODBC driver, server name, database, etc. directly
cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=localhost;DATABASE=testdb;UID=me;PWD=pass')
# Create a cursor from the connection
cursor = cnxn.cursor()
文档中的插入示例是
# Do the insert
cursor.execute("insert into products(id, name) values ('pyodbc', 'awesome library')")
#commit the transaction
cnxn.commit()
或更好地使用参数
cursor.execute("insert into products(id, name) values (?, ?)", 'pyodbc', 'awesome library')
cnxn.commit()
正如文件所说的
请注意对cnxn.commit()的调用。您必须调用commit,否则您的更改将丢失当连接关闭时,任何挂起的更改都将回滚。这使得错误恢复非常容易,但您必须记住调用commit。
这里也是同样的问题,对上面的答案稍作修改。我为此挣扎了一段时间,意识到SQL正在运行,但没有提交。我的环境是Python 3.8.2,MSSQL Server Express 15.0.2070.41(2019)。我不得不使用cursor.commit(),它按预期工作。
import pyodbc
# cnxn info is in a text file so I can change it in one place
def cnxn():
f=open("sql_conn.csv")
sql_split=f.read().split(",")
server=sql_split[0]
database=sql_split[1]
uid=sql_split[2]
pwd=sql_split[3]
return pyodbc.connect('DRIVER={ODBC Driver 17 for SQL
Server};SERVER=%s;DATABASE=%s;UID=%s;PWD=%s' % (server,database,uid,pwd))
# sql statement is passed by .py script
def f_sql_insert(sql):
cursor = cnxn().cursor()
cursor.execute(sql)
cursor.commit()
cnxn().close()