【问题标题】:Object is not iterable issue对象不是可迭代的问题
【发布时间】:2019-01-10 06:49:27
【问题描述】:

我在部署 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

我收到了这个错误。

【问题讨论】:

  • 我不认为您的错误来自 createTable 函数。此外,您可能想查看创建表的其他方法。 str.format() 为您打开 sql 注入

标签: python sqlite flask


【解决方案1】:

我猜你正在将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:

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

CREATE TABLE my_table_name (col_1,)

这会导致 sqlite 抱怨没有第二列值的逗号。

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

否则,如果values 只有一个元素,则将其索引并显式地将其放在括号中的字符串中。

【讨论】:

  • 我试过了,但仍然遇到同样的错误:(我在本地运行并且工作得很好,但在 httpd 中,它不工作
  • 你能打印本地和httpd创建的SQL字符串然后比较吗?
  • 是的,我可以在本地打印 sql 字符串。但是我将应用程序转换为使用 ORM :) 并且运行良好 :) 非常感谢。
猜你喜欢
  • 1970-01-01
  • 2019-06-21
  • 2014-12-03
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-05
  • 2018-03-22
相关资源
最近更新 更多