【问题标题】:sqlite nested for loop bugsqlite嵌套for循环错误
【发布时间】:2019-03-12 20:26:02
【问题描述】:

我正在尝试制作一个 ChatBot,但遇到了一个小问题。我在 python 中有一个嵌套或循环,它应该循环通过一个包含其他表的所有名称的 sqlite 表。内部 for 循环遍历第一个内部的表格,遍历单元格。

for i in c.execute("""SELECT * FROM triggers_sql"""):
    for l in c.execute("""SELECT * FROM "{}" """.format(i)):
        print(i, l)

但是,出于某种原因,外部 for 循环仅循环通过第一个表的第一个单元格。我想不出我在这里做错了什么。

【问题讨论】:

  • 不要使用动态表名,这几乎总是表明数据库设计不佳。

标签: python sqlite iterator cursor


【解决方案1】:

您需要使用两个单独的光标来做到这一点。一个游标代表一个单一的结果集,内层c.execute()清除外层循环附加到游标上的结果集。

如果c 是一个连接对象,则需要显式创建游标:

outercursor = c.cursor()
for tablename, in outercursor.execute("SELECT tablename FROM triggers_sql"):
    innercursor = c.cursor()
    for row in innercursor.execute('SELECT * FROM "{}"'.format(tablename)):
        # ...

如果c 是一个游标对象,只需从连接中创建另一个。您甚至可以通过以下方式从现有光标执行此操作:

innercursor = c.connection.cursor()

请注意,可能有更好的方法来构建您的数据库,而您不必首先使用动态表名。将您现在使用单独表的所有内容存储在一个表中,并用一个额外的列替换表名。此时您可以使用JOIN 并将其留给 sqlite 来担心如何产生循环。

【讨论】:

  • 那么如何获得两个游标呢?最好是最简单但最有效的方法。
  • @HarryLe:你是怎么得到一个光标的?还是c 是连接对象?
  • c 是光标。
  • @HarryLe:然后看看你是如何创建那个光标的。创建另一个。您不仅限于一个光标。
猜你喜欢
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多