SQLite3,Python:fetchone()适用于table1但不适用于table2,但fetchall()适用于两者

时间:2014-02-27 23:26:53

标签: python sqlite

我不确定如何解决这个问题:我的SQLite3数据库中有三个表,当我尝试在fetchone()的for循环中访问它们时,table1的数据行不显示,但我的表3的数据行使用for循环和fetchone()显示得很好。 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列架构的子集。

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

感谢大家对他人的帮助!

1 个答案:

答案 0 :(得分:2)

您正在光标上循环。这会产生数据已经。当您致电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