对象不是可迭代的问题

时间:2019-01-10 06:49:28

标签: python sqlite flask

在部署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 :(得分:0)

我猜您正在以某种可迭代的方式将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中强制执行print语句。 tuple(values)确保任何类型的可迭代values(例如列表),都将转换为可迭代的元组。

if len(values) > 1

仅当传入的tuple(values)中包含多个元素时,才应使用values。否则将要执行的SQL将类似于

CREATE TABLE my_table_name (col_1,)

这会导致sqlite在没有第二列值的情况下以逗号来抱怨。

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

否则,如果values仅具有单个元素,则对其进行索引并将其显式放置在字符串中的括号中。