【问题标题】:Why is the program showing no output?为什么程序没有输出?
【发布时间】:2022-01-20 05:46:05
【问题描述】:

我运行此查询以获取不在表中的“tom”的详细信息。因此,如果我在 MySQL 命令客户端中运行 MySQL,它会像往常一样返回“空集”。

import mysql.connector as c
mydb = c.connect(host='localhost', user='root', passwd='mysql')
pointer = mydb.cursor()
pointer.execute('use menagerie')
pointer.execute("select * from pet where name = 'tom'")
for x in pointer:
    print(x)

我使用 MySQL python 连接器运行了这段代码,但它没有像 MySQL 那样说“空集”,只是给出了以下输出:

C:\Users\dhruv\AppData\Local\Programs\Python\Python39\python.exe D:/Programmes/Mysql.py

Process finished with exit code 0

所以我的问题是,当 MySQL 不提供任何输出时,如何让程序返回用户定义的消息?

【问题讨论】:

    标签: python mysql


    【解决方案1】:

    使用pointer.fetchall() 获取所有结果。然后你可以检查这是否是一个空列表。

    results = pointer.fetchall()
    if len(results) == 0:
        print("empty result")
    else:
        for x in results:
            print(x)
    

    参考:https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-rowcount.html

    【讨论】:

    • 在获取行之前真的知道吗?
    • 是的。它从数据库中获取它,它知道。
    • 您链接到的页面上的第二段呢?不是说反了吗?
    • 那段说 “对于非缓冲游标,在获取行之前无法知道行数” 并且文档在其他地方说非缓冲是默认设置。并且 OP 不会对其进行缓冲,是吗?
    • 在检查行数之前循环游标将确保行数是“正确的”。我发现空结果集(使用 MariaDB)保持在 -1。
    【解决方案2】:

    一个没有fetchall

    x = dummy = object()
    for x in pointer:
        print(x)
    if x is dummy:
        print('empty set')
    

    【讨论】:

      【解决方案3】:

      您可以使用print(pointer.fetchall()) 代替for 循环。因此,如果没有结果,它将返回空集[]。并尝试使用try{}...catch{} 来有效地处理错误/警告。

      【讨论】:

      • [] 不是空集。请检查您的答案。
      • @deponovo 为什么?给定上下文(它代表“结果集”),在我看来这完全没问题。
      • @KellyBundy 然后“空集”就足够了。这里混合了两件事:容器的数学或类似数学的表示和python 语法。既然答案直接指向代码输出,那么为什么不遵守纪律并保持set() 的正确python 表示,如果这实际上是预期的。
      • @deponovo 因为fetchall 不返回set()。它返回[](或非空结果集的非空列表)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 2023-02-05
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多