在部署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
我收到此错误。
答案 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
仅具有单个元素,则对其进行索引并将其显式放置在字符串中的括号中。