Ошибка атрибута: объект ‘NoneType’ не имеет атрибута ‘fetchall’

#python #mysql #mysql-connector

#python #mysql #mysql-connector

Вопрос:

Я попытался создать короткую функцию-оператор, которая вернет мне результат запроса. Это отлично работает с pyodbc, но не с mysql connector.

Вывод был :

Файл «/mySQLDB.py «, строка 17, в execute_and_fetch result = conn.cursor().execute(запрос, параметры).fetchall () Ошибка атрибута: объект ‘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
 

Комментарии:

1. Не означает ли ошибка, что «conn.cursor().execute (query, params)» вернул значение None?

2. @BobbyOcean, если я вас хорошо понимаю. Вы пытаетесь сказать, что это не пустой набор записей?

3. Все, что я знаю, это то, что ваш код использует только «fetchall ()» на месте, которое находится в коде «conn.cursor ().execute (query, params)». Следовательно, запуск этого .execute() должен возвращать значение None .

Ответ №1:

PEP 249, спецификация DBAPI, говорит, что возвращаемое значение 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
 

Комментарии:

1. line 18, in execute_and_fetch with conn.cursor() as cursor: AttributeError: __enter__