【问题标题】:Why in a simple loop I lose fetchAll's values of a sqlite3's table using python?为什么在一个简单的循环中,我使用 python 丢失了 sqlite3 表的 fetchAll 值?
【发布时间】:2023-03-18 06:38:01
【问题描述】:

我需要使用 python3 从 sqlite3 的表中打印一些行,但在循环中我没有得到任何值。按照我的代码:

import sqlite3
db=sqlite3.connect('db.db')
cdb=db.cursor()
cdb.execute('create table if not exists table1 (field1,field2,field3)')
cdb.execute('insert into table1 values (?,?,?)',(1,2,3))
db.commit()
cdb.execute('insert into table1 values (?,?,?)',(4,5,6))
db.commit()
cdb.execute('insert into table1 values (?,?,?)',(1,7,8))
db.commit()
cdb.execute('select * from table1')
for i in range(len(cdb.fetchall())):
    if cdb.fetchone()[0]==1:print(cdb.fetchone())
db.close()

我的错误信息:
AttributeError: 'NoneType' 对象没有属性 'replace'

谢谢

【问题讨论】:

    标签: python-3.x sqlite loops


    【解决方案1】:

    您对cdb.fetchall() 的调用会消耗迭代器并且毫无意义,因此请移除它:

    for row in cdb.execute('select * from table1'):
        # do something with row
    

    official documentation 中所述。

    【讨论】:

    • 抱歉总是同样的错误信息
    • @Tommy 错误出现在哪一行?
    • @Tommy 代码既不在您的问题中,也不在我的答案中。您是否尝试过实施我的建议?
    • @Tommy 然后你在 for 循环中做了什么?一个简单的print(row) 将是一个起点。
    • @Tommy 很高兴听到这个消息!请考虑将答案标记为已接受和/或投票以完成 Q/A 周期。
    【解决方案2】:

    在您fetchall 之后,光标指向任何内容,因此如果您获取任何内容,它将返回None

    要查看提交数据后发生的情况,请尝试:

    cdb.execute('select * from table1')
    
    print(cdb.fetchall()) # Return the data
    print(cdb.fetchone()) # Return : None
    
    db.close()
    

    要解决这个问题,您可以在 fetchone 女巫变慢之前再次执行 sql

    我建议这样做:

    cdb.execute('select * from table1')
    
    data = cdb.fetchall()
    for i in data:
        if i[0] == 1: print(i)
    
    db.close()
    

    【讨论】:

      猜你喜欢
      • 2011-05-14
      • 2018-11-08
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多