【问题标题】:How do I test whether a Python SQL query worked if it's not supposed to return anything?如果 Python SQL 查询不应该返回任何内容,我该如何测试它是否有效?
【发布时间】:2022-01-12 00:51:40
【问题描述】:

我在这里阅读了一篇关于错误处理的优秀文章。 Error handling in Python-MySQL

还有一千个类似的问题来自人们的问题,他们的查询没有返回任何内容 - 但那是因为它应该返回。

我有一个稍微不同的问题。

我有一个 SQL 查询,旨在转换创建一个新表。

SELECT *
INTO MyDataBase.MySchema.NewTable
FROM

    (SELECT
        ID,
        Count(*) AS ProductCount
    FROM
        MyDataBase.MySchema.MyTable
    GROUP BY 
        ID

    ) ProductCount

如果我在 SSMS 中运行查询,它会完美运行,SSMS 只会告诉我

(1901 rows affected)
Completion time: 2021-12-07T09:28:32.2541722+13:00

但是在我故意错误编辑代码并尝试从 pyhon 脚本运行查询后,我得到了一个模糊的结果,没有任何迹象表明该脚本没有; t 实际工作。

row = curs.fetchone()
pyodbc.ProgrammingError: No results.  Previous SQL was not a query.

所以...我如何检查转换(SQL 查询)是否成功运行,即使它不应该从 python 返回任何结果...?

我知道它没有。

【问题讨论】:

  • 您是否考虑过将其包装在 begin - end 块中并返回成功状态
  • No.... 成功状态?
  • 查询没有返回错误意味着语句运行成功...
  • “不抛出错误”并不总是意味着“工作”。小心你的假设以及你如何应用这个概念。
  • @Lamu 所以你是说反转解释?除非另有说明,否则假设它有效?嗯,这正是另一个转换类型查询发生的事情。当我尝试时,查询实际上在 SSMS 中失败了。但是python方法什么也没说。

标签: sql-server pyodbc python-cursor


【解决方案1】:

fetchone() 是在有输出时返回行。在你的情况下你不需要它。

您只需使用cursor.execute('drop table..') 即可运行任何 DDL 语句。没有办法确定它是否真的有效,但如果它没有出错,那么它就成功了。您可以根据情况进行额外检查。

另外别忘了在最后做一个cursor.commit(),否则它不会提交你所有的语句。

【讨论】:

  • “无法确定它是否真的有效”。这正是问题所在。所以我试图运行的特定查询很长,实际上它在 SSMS 中不起作用。但是当我从 python 运行它时,我没有收到任何反馈说它不起作用。所以你的意思是我必须去做具体的检查,看看查询是否达到了预期的效果?
  • 是的,您可以尝试将 TRANSACTION 与 TRY CATCH 一起使用,就像在这篇文章中一样。 stackoverflow.com/questions/25146656/…
  • 我认为我们在谈论不同的目的。您指出我的文章是处理 SQL 脚本本身的问题。那不是我的方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
相关资源
最近更新 更多