【问题标题】:Why would MySQL execute return None?为什么 MySQL 会执行返回 None?
【发布时间】:2021-03-23 11:52:07
【问题描述】:

我正在尝试使用 Python 的 (3.4) MySQL 模块和以下代码查询本地 MySQL 数据库:

class databases():

  def externaldatabase(self):

  try:
    c = mysql.connector.connect(host="127.0.0.1", user="user",
                                password="password", database="database")
     if c.is_connected():
           c.autocommit = True
      return(c)
    except:
         return(None)
    d = databases().externaldatabase()
    c = d.cursor() 
    r = c.execute('''select * from tbl_wiki''')
    print(r) 
> Returns: None

据我所知,连接成功,数据库由几行组成,但查询总是返回无类型。

MySQL执行函数返回None的实例有哪些?

【问题讨论】:

  • c.execute() 不会返回任何内容,除非您使用 multi=True 选项。然后它返回一个迭代器,让您可以在多个查询中逐步执行每个查询的结果。
  • 通常你调用游标上的方法来获取查询的结果,例如c.fetchone() 获取一行,c.fetchall() 获取所有结果。
  • 您使用的是哪个 MySQL 接口?通常,对于 Python DB-API 数据库库,execute 返回None。 (DB-API 规范只是说“返回值未定义”。)execute 的重点是修改游标,以便您可以从中提取行,在 Python 中,修改对象的方法通常返回 None。某些库在某些情况下确实有返回值 execute 用于快捷方式或附加功能,但如果您不使用任何这些情况,则不应期望 execute 有任何意义。
  • @BarryBrian 你确定你在做c.fetchone(),而不是r.fetchone()?

标签: python mysql sql


【解决方案1】:

查询执行没有返回值。

你需要遵循的模式是:

cursor creation;
cursor, execute query;
cursor, *fetch rows*;

或者在python中:

c = d.cursor()

c.execute(query)    # selected rows stored in cursor memory

rows = c.fetchall()    # get all selected rows, as Barmar mentioned
for r in rows:
    print(r)

还有一些 db 模块允许您使用 for...in 模式遍历游标,但对 mysql 进行三重检查。

【讨论】:

    【解决方案2】:

    对于我的情况,我返回 cursor,因为我需要返回 string 的值,例如,我返回密码(字符串)以检查用户是否两次使用相同的密码。这是我的做法(就我而言):

    def getUserPassword(metadata):
        cursorObject.execute("SELECT password FROM users WHERE email=%s AND password=%s LIMIT 1", (metadata['email'], metadata['password']))
        return cursorObject.fetchall()[0]['password']
    

    我可以通过调用方法轻松地从另一个class 调用:

    assert getUserPassword({"email" : "email", "password" : "oldpass"}) is not None
    

    getUserPassword 本身返回的是string

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多