Pyodbc插入SQL

56

我使用的是 MS SQL Express 数据库,可以连接并获取数据,但无法插入数据:

cursor.execute("insert into [mydb].[dbo].[ConvertToolLog] ([Message]) values('test')")

我没有收到错误提示,但是没有数据被插入到表中。在获取数据之后直接获取插入的行,但是没有数据被保存。

在MS SQL Server Management Studio中插入操作是正常的。

2个回答

113

您需要提交数据。每个SQL命令都在一个事务中,必须提交该事务才能将该事务写入SQL服务器,以便其他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。


在我的情况下,cnxn(也称为connection)的“cnxn.commit()”没有起作用,但是我使用了完全相同的游标,如“cursor.commit()”。 - prhmma

1
我也遇到了同样的问题,对上面的回答进行了些许修改。我苦苦挣扎了一段时间,意识到 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()

2
看起来你没有关闭现有的连接,而是创建了一个新的连接并关闭了新的连接。 - Alexandr Kapshuk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接