Python: werkzeug.exceptions.InternalServerError: 500 Ошибка внутреннего сервера: объект ‘NoneType’ не является итеративным

#python #sql #postgresql #flask #rest

#python #sql #postgresql #flask #rest

Вопрос:

Я видел много решений этой проблемы, но ни одно из них не решало мою.

У меня есть этот INSERT запрос, который завернут в try / except, и, хотя он отлично работает в базе данных (данные вставлены правильно), вызывается трассировка, код переходит к except, а код под выполнением запроса просто игнорируется (чего не может произойти в моем случае).

Это что-то вроде этого:

 query = """
  INSERT INTO
    mytable(user_id, tcx_extension, user_email, created_date)
  VALUES
    {}
""".format("('12345678910', '6666', 'test123@test.com', '2020/01/06 00:00:00')")

self.pgsql.execute_query(query)  // the error is triggered here

//important code below that is ignored when the error fires
 

self.pgsql.execute_query функция показана ниже:

 def execute_query(self, query, retry=0, format=True):
    if self.pool is None:
        self._open_pool(PGSQL["connection_string"])

    try:
        conn = self.pool.getconn()

        cur = conn.cursor()
        conn.autocommit = True

        LOG.info("Executing query", extra={"query": query})
        cur.execute(query)

        if format is True:
            data = Formatter.format_cursor(cur)
        else:
            data = None
        self.pool.putconn(conn)
        cur.close()

   except pool.PoolError as e:
        LOG.error("PoolError: {}".format(e), extra={"query": query})
        if retry > MAX_RETRIES:
            raise TooManyRetries("Too many retries: {}".format(e))

        LOG.info("Will retry: {}".format(e), extra={"query": query})
        time.sleep(1)
        return self.execute_query(query, retry   1)

    return data
 

Обратная трассировка показана ниже:

 [2021-01-06 15:28:15,421] ERROR in app: Exception on /members/manage_socket_members [POST]
Traceback (most recent call last):
  File "C:Usersartur.santosAppDataLocalProgramsPythonPython37libsite-packagesflaskapp.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:Usersartur.santosAppDataLocalProgramsPythonPython37libsite-packagesflaskapp.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "C:Usersartur.santosAppDataLocalProgramsPythonPython37libsite-packagesflask_restful__init__.py", line 480, in wrapper
    resp = resource(*args, **kwargs)
  File "C:Usersartur.santosAppDataLocalProgramsPythonPython37libsite-packagesflaskviews.py", line 84, in view
    return self.dispatch_request(*args, **kwargs)
  File "C:Usersartur.santosAppDataLocalProgramsPythonPython37libsite-packagesflask_restful__init__.py", line 595, in dispatch_request
    resp = meth(*args, **kwargs)
  File "C:Usersartur.santosDocuments#salesforcerc-analytics-apisrcdecoratorsauth.py", line 70, in wrap
    return f(*args, **kwargs)
  File "C:Usersartur.santosDocuments#salesforcerc-analytics-apisrcmembersmanage_socket_members.py", line 30, in post
    return abort(500, error)
  File "C:Usersartur.santosAppDataLocalProgramsPythonPython37libsite-packageswerkzeugexceptions.py", line 707, in abort
    return _aborter(status, *args, **kwargs)
  File "C:Usersartur.santosAppDataLocalProgramsPythonPython37libsite-packageswerkzeugexceptions.py", line 687, in __call__
    raise self.mapping[code](*args, **kwargs)
werkzeug.exceptions.InternalServerError: 500 Internal Server Error: 'NoneType' object is not iterable
 

Есть идеи о том, как это решить?

РЕДАКТИРОВАТЬ 1: все поля таблицы имеют тип ‘VARCHAR’, за исключением created_date .

РЕДАКТИРОВАТЬ 2: когда я пытаюсь вставить некоторые значения между двойными кавычками, ошибка изменяется (что для меня также является бессмысленной ошибкой). Я не знаю, приближает ли меня к решению. Проверьте это в журналах, которые я распечатал

 > query: INSERT INTO wfm.socket_user_relation (user_id, tcx_extension, user_email, created_date) VALUES (12345678937, 63, "test37@test.com.br", "2021/01/07 09:25:35")
> exception: column "test37@test.com.br" does not exist
LINE 1: ...ser_email, created_date) VALUES (12345678937, 63, "test37@te...
                                                             ^
 

РЕДАКТИРОВАТЬ 3: если я попытаюсь INSERT заключить все из них в двойные кавычки, ошибка останется прежней: Error: 500 Internal Server Error: 'NoneType' object is not iterable

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

1. Можете ли вы распечатать значение «данные для заполнения полей»? А также где вы закрываете соединение?

2. @demokritos сообщение было обновлено с необходимой информацией. Соединение закрывается с помощью оператора return за пределами try / except .

3. Измените форматирование с .format("('12345678910', '6666', 'test123@test.com', '2020/01/06 00:00:00')") на .format('12345678910', '6666', 'test123@test.com', '2020/01/06 00:00:00')

4. Это не сработало, @JohnGardounis. Проверьте журнал «EDIT: 2», который я напечатал: запрос именно такой, каким я его ожидаю. Он ВСТАВЛЯЕТ данные в базу данных, но я не могу получить от него никакого ответа об успехе, я просто знаю это, потому что у меня есть маршрут GET, который выбирает все из этой таблицы. Ошибка not iterable просто пропускает каждый код, который находится после строки, которая выполняет запрос.

5. Ошибка находится в user_email столбце, каков тип данных в базе данных?

Ответ №1:

Вы не устанавливаете format параметр при выполнении функции, и поэтому он всегда True (как вы установили в определении функции).

Ответ, когда вы успешно вставляете что-то в базу данных PgSQL None , и невозможно использовать формат строки a NoneType Object .

Просто используйте приведенный выше код, и все будет в порядке.

 self.pgsql.execute_query(query, format=False).