【问题标题】:"ProgrammingError: No results. Previous SQL was not a query." while trying to truncate a table“ProgrammingError:没有结果。以前的 SQL 不是查询。”在尝试截断表格时
【发布时间】:2020-09-29 16:43:50
【问题描述】:

我正在尝试从表中删除所有条目,但无法执行此操作。 不管是 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:没有结果。以前的 SQL 不是查询。

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

从 pycharm 的 Python 控制台执行时,每当我尝试访问数据对象时都会出现以下错误(例如 print(data.fetchval()):

Traceback(最近一次调用最后一次): 文件“”,第 1 行,在 pyodbc.ProgrammingError:没有结果。以前的 SQL 不是查询。

我之前读过可能与 DDBB 表的索引方式及其私钥有关,但我无法解释它。

【问题讨论】:

  • 你怎么知道查询是正确的?您是否尝试在 SQL Server Management Studio 中执行并且它有效?你拦截了数据库日志吗?它们显示了哪些错误?
  • 我无法重现您的问题。 This code 无需抛出 ProgrammingError 即可工作。请edit您的问题以显示完整的堆栈跟踪。
  • @GordThompson 我做了同样的事情,当调用data.fetchval() 时,我得到:回溯(最近一次调用最后):文件“”,第 1 行,在 pyodbc.ProgrammingError : 没结果。以前的 SQL 不是查询。这是来自命令行。
  • @sophros 是的,在 sql server manager 中的新查询上运行它时,它会输出“命令已成功完成”。并且日志显示没有来自 pyodbc 命令的尝试或信息。我在看here

标签: python sql-server pyodbc sql-delete sql-server-express


【解决方案1】:

我希望得到受影响的行数。

当我们通过Cursor.execute 执行单个SQL 语句时,服务器可以返回以下三种情况之一:

  1. 结果集中有零行或多行数据(对于 SELECT 语句),或
  2. 一个整数行数(用于 DML 语句,如 UPDATE、DELETE 等),或
  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 是一种特殊情况,因为它不会计算从表中删除的行数;它只返回 -1 的行数……

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

...但是这些行确实被删除了

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 2013-04-09
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 2013-05-18
    相关资源
    最近更新 更多