Объект не повторяемый вопрос - PullRequest
0 голосов
/ 10 января 2019

Я получаю сообщение об ошибке «объект не повторяется» в приложении колбы, в котором развернуто httpd.

def createTable(self, table_name, values):
    print('IN CREATE TABLE')
    cursor = self.conn.cursor()
    cursor.execute(
        """
        CREATE TABLE {table_name} ({values})
        """.format(table_name=table_name, values=values)
    )
    self.conn.commit()
    print('OUT CREATE TABLE')

Первая распечатка, содержащая IN CREATE TABLE, распечатана, но вторая печать не распечатана. Итак, есть проблема в создании таблицы, но я не вижу.

mod_wsgi (pid=13470): Exception occurred processing WSGI script '/home/ec2-user/master/app.wsgi'.
 Traceback (most recent call last):
   File "/usr/local/lib/python3.7/site-packages/werkzeug/wsgi.py", line 870, in __next__
     return self._next()
   File "/usr/local/lib/python3.7/site-packages/werkzeug/wrappers.py", line 82, in _iter_encoded
     for item in iterable:
 TypeError: 'OperationalError' object is not iterable

И я получаю эту ошибку.

1 Ответ

0 голосов
/ 10 января 2019

Я предполагаю, что вы передаете values в createTable как нечто итеративное. Я бы удалил парантез вокруг ({values}) и использовал бы следующее для format:

"""
CREATE TABLE {table_name} {values}
""".format(table_name=table_name, values=tuple(values) if len(values) > 1 else "({})".format(values[0]))

Итак, ломая values=tuple(values) if len(values) > 1 else "({})".format(values[0]) мы имеем

tuple(values):

При создании таблицы в sqlite имена столбцов должны быть заключены в круглые скобки, поэтому я обычно использую тип кортежа для принудительного применения этого в format для оператора печати. tuple(values) гарантирует, что независимо от типа итерируемого values (как, например, список), он будет преобразован в итерируемый кортеж.

if len(values) > 1:

Вы должны использовать tuple(values) только тогда, когда переданный values содержит более одного элемента. В противном случае SQL, который будет выполнен, будет выглядеть примерно так:

CREATE TABLE my_table_name (col_1,)

Что заставит sqlite пожаловаться на эту запятую без значения второго столбца.

else "({})".format(values[0]):

В противном случае, если values имеет только один элемент, индексируйте его и явно поместите в скобки в строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...