【问题标题】:SQLite3, Python: fetchone() works on table1 but not table2 but fetchall() works on bothSQLite3,Python:fetchone() 适用于 table1 但不适用于 table2 但 fetchall() 适用于两者
【发布时间】:2014-03-31 17:35:00
【问题描述】:

我不知道如何解决这个问题:我的 SQLite3 数据库中有三个表,当我尝试使用 fetchone() 在 for 循环中访问它们时,表 1 的数据行没有显示,但是使用 for 循环和fetchone(),我的表 3 的数据行显示得很好。 fetchall() 是唯一可以访问 table1 中数据的方法,fetchall() 也适用于 table3。我在 table1 和 3 个文本列中只有一行数据,在 table3 和 6 个文本列中只有很多行数据。这个交互模式示例显示了与我的非交互脚本相同的问题:

>>> cur.execute('select * from ' + tablename1)
<sqlite3.Cursor object at 0x021A3420>
>>> print '\n'+str(cur.fetchall())

[(u'OMAHA / COUNCIL BLUFFS, NEBRASKA, US', None, u'green')]
>>> cur.execute('select * from ' + tablename1)
<sqlite3.Cursor object at 0x021A3420>
>>> for row in cur:
...     data = cur.fetchone()
...     print data
...
None
>>> cur.execute('select * from '+tablename1)
<sqlite3.Cursor object at 0x021A3420>
>>> cur.execute('PRAGMA table_info('+tablename1+')')
<sqlite3.Cursor object at 0x021A3420>
>>> data = cur.fetchall()
>>> for d in data:
...     print d[0], d[1], d[2]
...
0 REGIONUPPERCASE TEXT
1 REGION TEXT
2 REDGREEN TEXT

>>> cur.execute('select * from '+tablename3)
<sqlite3.Cursor object at 0x021A3420>
>>> cur.execute('PRAGMA table_info('+tablename3+')')
<sqlite3.Cursor object at 0x021A3420>
>>> data = cur.fetchall()
>>> for d in data:
...     print d[0], d[1], d[2]
...
0 REGIONUPPERCASE TEXT
1 REGION TEXT
2 REDGREEN TEXT
3 COORDSLAT TEXT
4 COORDSLONG TEXT
5 CLHREF TEXT

>>> cur.execute('select * from ' + tablename3)
<sqlite3.Cursor object at 0x021A3420>
>>> for row in cur:
...     data = cur.fetchone()
...     print data
...
(u'BIRMINGHAM, ALABAMA, US', u'birmingham, Alabama, US', u'red', u'33.5206608', u'-86.80249', u'
(u'FLORENCE / MUSCLE SHOALS, ALABAMA, US', u'florence / muscle shoals, Alabama, US', u'red', u'3
(u'HUNTSVILLE / DECATUR, ALABAMA, US', u'huntsville / decatur, Alabama, US', u'red', u'34.72849'
(u'MONTGOMERY, ALABAMA, US', u'montgomery, Alabama, US', u'red', u'32.3668052', u'-86.2999689',
(u'ANCHORAGE / MAT-SU, ALASKA, US', u'anchorage / mat-su, Alaska, US', u'red', u'61.340307', u'-
(u'KENAI PENINSULA, ALASKA, US', u'kenai peninsula, Alaska, US', u'red', u'59.8785222', u'-150.3
(u'FLAGSTAFF / SEDONA, ARIZONA, US', u'flagstaff / sedona, Arizona, US', u'red', u'34.8262376',

就像我说的,fetchall() 适用于 table3,我只是没有在此处发布该输出。到目前为止,我还没有进入 table2(这是一个新创建的数据库,我还没有完全发挥作用)所以我们现在不用担心 table2。它将更类似于 table1 而不是 table3。换句话说,tables1 和 2 列架构是 table3 列架构的子集。

我想知道其中的表或数据是否已损坏或已损坏。那可能吗。这对我来说似乎很奇怪。我不知道如何解决这个问题或从哪里开始,所以我向任何有能力的人寻求帮助。

感谢大家对他人的帮助!

【问题讨论】:

    标签: python sqlite


    【解决方案1】:

    你正在循环光标。这会产生已经的数据。到您致电 fetchone() 时,该行已被送达。

    只需使用循环变量,它包含您迭代时的每一行结果:

    cur.execute('select * from ' + tablename1)
    for row in cur:
        print row
    

    您在tablename3 上的循环只能看到一半的行;您通过迭代获取一行,忽略该行,使用cur.fetchone() 获取下一行并打印该行,循环重复该过程。

    使用迭代fetchone()fetchall()。不要将两者混为一谈。

    fetchone() 将用于仅获取 一个 结果行,例如:

    cur.execute('select * from ' + tablename1 + ' WHERE unique_column=?', ('somevalue',))
    row = cur.fetchone()
    if row is not None:
        # there was a matching row, rejoice
        print row
    

    【讨论】:

    • ?我不太明白。我相信您确实看到我正在为两个表执行相同的命令结构?我会继续阅读你的答案,直到我弄清楚你的意思。哦!所以你的意思是 table3 中的第一行数据被跳过了?而且由于 table1 只有一行,所以看起来什么都没有?现在明白了!谢谢!!!
    • @kenneth558:您正在使用for 循环来循环游标对象。 这会产生结果。这意味着当您这样做时,光标也会移动到下一行,因此row 是数据库中的第一行,data = cur.fetchone() 尝试检索 second 行。但是你的表只有一行,所以调用返回None
    猜你喜欢
    • 1970-01-01
    • 2020-07-28
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 2020-11-23
    相关资源
    最近更新 更多