"ProgrammingError: No results. Previous SQL was not a query." while trying to truncate a table

"ProgrammingError: No results. Previous SQL was not a query." while trying to truncate a table

我正在尝试删除 table 中的所有条目,但无法删除。 不管是 TRUNCATE 还是 DELETE 关键字。出现同样的错误

import pyodbc
conn = pyodbc.connect(
                r'Driver={SQL Server};'
                r'Server=' + ip + '\SQLEXPRESS;'
                                  r'Database=...;'
                                  r'UID=...;'
                                  r'PWD=...;', timeout=5)
cursor = conn.cursor()
data = cursor.execute("TRUNCATE TABLE table_name")

pyodbc.ProgrammingError: No results. Previous SQL was not a query.

autocommit 设置为 True 无效。参数化它也不起作用。连接是正确的,因为 SELECT 子句运行良好并且 returns 是正确的值。截断和删除它根本不起作用。 DDBB 仍然完好无损。

从 pycharm 的 Python 控制台执行时,每当我尝试访问数据对象 (f.e。print(data.fetchval()):

Traceback (most recent call last): File "", line 1, in pyodbc.ProgrammingError: No results. Previous SQL was not a query.

我之前读过 DDBB table 的索引方式及其私钥,但我无法解释。

I was hoping on getting the number of rows affected.

当我们通过 Cursor.execute 执行单个 SQL 语句时,服务器可以 return 三件事之一:

  1. 结果集中的零个或多个数据行(对于 SELECT 语句),或
  2. 一个整数行计数(对于更新、删除等 DML 语句),或
  3. 一个错误。

我们通过 pyodbc 方法 .fetchall().fetchone().fetchval() 等从结果集中检索信息。我们使用游标的 rowcount 属性检索行计数.

crsr = cnxn.cursor()
crsr.execute("DROP TABLE IF EXISTS so64124053")
crsr.execute("CREATE TABLE so64124053 (id int primary key, txt varchar(10))")
crsr.execute("INSERT INTO so64124053 (id, txt) VALUES (1, 'foo')")
print(crsr.rowcount)  # 1
print(crsr.execute("SELECT COUNT(*) AS n FROM so64124053").fetchval())  # 1
crsr.execute("INSERT INTO so64124053 (id, txt) VALUES (2, 'bar')")
print(crsr.rowcount)  # 1
print(crsr.execute("SELECT COUNT(*) AS n FROM so64124053").fetchval())  # 2

请注意,TRUNCATE 是一种特殊情况,因为它不会计算从 table 中删除的行;它只是 return 的行数为 -1 …

crsr.execute("TRUNCATE TABLE so64124053")
print(crsr.rowcount)  # -1

...但是确实删除了行

print(crsr.execute("SELECT COUNT(*) AS n FROM so64124053").fetchval())  # 0