【问题标题】:Print if MySQL returns no results如果 MySQL 没有返回结果,则打印
【发布时间】:2013-10-23 07:50:27
【问题描述】:

到目前为止,这是我的代码。如果 MySQL 没有返回任何结果,我正在尝试打印 No results found,但我无法弄清楚。也许我使用了不正确的论点。谁能给我一个例子?非常感激!

def movie_function(film):
    connection = mysql connection info
    cursor = connection.cursor()
    sql = "SELECT * FROM film_database WHERE film_name = '"+film+"' ORDER BY actor"

    cursor.execute(sql)
    rows = cursor.fetchall()
    for row in rows:
        print row[1]

【问题讨论】:

  • 你试过什么?我看不到您要在哪里打印“未找到结果”。提示它需要在 if 声明中。
  • 只检查行的长度。如果 len(rows) == 0,打印 'No results found'
  • 你可以自己检查行if not rows:

标签: python mysql python-2.7


【解决方案1】:

当您执行一个 select 语句时,cursor.rowcount 设置为检索到的结果数。另外,没有必要打电话给cursor.fetchall();直接在光标上循环更容易:

def movie_function(film):
    connection = mysql connection info
    cursor = connection.cursor()
    sql = "SELECT * FROM film_database WHERE film_name = %s ORDER BY actor"

    cursor.execute(sql, (film,))
    if not cursor.rowcount:
        print "No results found"
    else:
        for row in cursor:
            print row[1]

请注意,我还将您的代码切换为使用 SQL 参数;这里不需要使用字符串插值,把它留给数据库适配器。 %s 占位符替换为从 cursor.execute() 的第二个参数中获取的正确引用的值,这是一个值序列(这里是一个元素的元组)。

使用 SQL 参数还可以让良好的数据库重用 select 语句的查询计划,并将引用留给数据库适配器防止 SQL 注入攻击。

【讨论】:

    【解决方案2】:

    您可以在代码后使用cursor.rowcount 来查看实际返回了多少行。请参阅here 了解更多信息。

    【讨论】:

      【解决方案3】:

      我想,这应该可行。

      def movie_function(film):
          connection = mysql connection info
          cursor = connection.cursor()
          sql = "SELECT * FROM film_database WHERE film_name = %s ORDER BY actor"
      
          cursor.execute(sql, [film])
          rows = cursor.fetchall()
          if not rows:
              print 'No resulrs found'
              return
          for row in rows:
              print row[1]
      

      注意,我更改了film 参数传递给查询的方式。我不知道它应该是怎样的(这取决于你使用的 MySQL 驱动程序),但重要的是要知道,出于安全原因,你不应该将参数直接传递给查询字符串。

      【讨论】:

      • 这行不通;标准 MySQLdb 数据库适配器使用 %s 样式参数。您需要将.execute() 的第二个参数设为一个序列,即一个元组或一个列表。就目前而言,如果film 是一个字符串,数据库适配器将尝试将每个单独的字符视为一个参数值,然后抱怨参数太多。
      • 谢谢,正如我所说,我不知道这个适配器是如何实现的。
      【解决方案4】:

      你也可以使用:

      rows_affected=cursor.execute("SELECT ... ") -> 你有直接返回的行数

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 1970-01-01
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多