【问题标题】:AttributeError: 'NoneType' object has no attribute 'fetchall'AttributeError:“NoneType”对象没有属性“fetchall”
【发布时间】:2021-05-12 20:04:58
【问题描述】:

我尝试创建一个简短的语句函数,它将返回给我的查询结果。 这适用于 pyodbc 但不适用于 mysql 连接器。

输出是:

文件“/mySQLDB.py”,第 17 行,在 execute_and_fetch 中 结果 = conn.cursor().execute(query, params).fetchall() AttributeError: 'NoneType' 对象没有属性 'fetchall'

import mysql.connector

class MYSQLDB:
    def __init__(self):
        self.host = 'xx'
        self.database = 'xx$xx'
        self.user = 'xx'
        self.password = 'xx'

    def execute(self, query, *params):
        mysql.connector.connect(host=self.host, database=self.database,
                         user=self.user, password=self.password).cursor().execute(query, params).commit()

    def execute_and_fetch(self, query, *params):
        conn = mysql.connector.connect(host=self.host, database=self.database,
                         user=self.user, password=self.password)
        result = conn.cursor().execute(query, params).fetchall()
        conn.commit()
        return result

【问题讨论】:

  • 这个错误不是意味着“conn.cursor().execute(query, params)”返回了一个None值吗?
  • @BobbyOcean 如果我理解你的话。你想说它不是空的记录集?
  • 我所知道的是,您的代码仅在代码“conn.cursor().execute(query, params)”上使用“fetchall()”。因此,运行 .execute() 必须返回 None 值。

标签: python mysql mysql-connector


【解决方案1】:

PEP 249, the DBAPI spec,表示execute 的返回值未定义。相当多的 DBAPI 实现返回 None,这意味着您不能(可移植地)链接 execute().fetchall(),因为您正在尝试这样做。

【讨论】:

    【解决方案2】:

    试试这个代码。 如果您仍然遇到问题,请检查与数据库的连接是否成功。

    import mysql.connector
    
    class MYSQLDB:
        def __init__(self):
            self.host = 'xx'
            self.database = 'xx$xx'
            self.user = 'xx'
            self.password = 'xx'
    
        def execute(self, query, *params):
            mysql.connector.connect(host=self.host, database=self.database,
                             user=self.user, password=self.password).cursor().execute(query, params).commit()
    
        def execute_and_fetch(self, query, *params):
            conn = mysql.connector.connect(host=self.host, database=self.database,
                             user=self.user, password=self.password)
            
            with conn.cursor() as cursor:
    
                cursor.execute(query, params=None)
    ...         result = cursor.fetchall()
                conn.commit()
                return result
    

    【讨论】:

    • line 18, in execute_and_fetch with conn.cursor() as cursor: AttributeError: __enter__
    猜你喜欢
    • 1970-01-01
    • 2012-11-04
    • 2019-01-01
    • 2021-12-26
    • 2019-07-23
    • 2018-05-13
    • 2020-09-07
    • 2017-05-03
    • 2023-03-16
    相关资源
    最近更新 更多