SQLite3,Python:fetchone()对表1有效,但对表2无效,但fetchall()对两者都有效



我不知道如何解决这个问题:我的SQLite3数据库中有三个表,当我尝试在使用fetchone()的for循环中访问它们时,表1的数据行不会显示,但使用for循环和fetchone(),表3的数据行显示得很好。fetchall()是访问表1中数据的唯一方法,fetchall()也适用于表3。我在表1和表3中只有一行数据,在表3和表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()适用于表3,我只是没有在这里发布输出。到目前为止,我还没有进入表2(这是一个新创建的数据库,我还没完全发挥作用),所以现在我们不用担心表2。它将更类似于表1而不是表3。换句话说,表1和2列模式是表3列模式的子集。

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

感谢大家对他人的帮助!

您正在光标上循环。这就产生了已经的数据。当您呼叫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

相关内容

最新更新