SQLite3,Python:fetchone()适用于表1,但不适用于表2,但fetchall()适用于两者

SQLite3,Python:fetchone()适用于表1,但不适用于表2,但fetchall()适用于两者,python,sqlite,Python,Sqlite,我不知道如何解决这个问题:我的SQLite3数据库中有三个表,当我尝试使用fetchone()在for循环中访问它们时,表1的数据行不会显示出来,但是使用for循环和fetchone()可以很好地显示表3的数据行。fetchall()是访问表1中数据的唯一方法,而fetchall()也适用于表3。我只在表1和表3的文本列中有一行数据,在表3和表6的文本列中有许多行数据。此交互式模式示例显示了与我的非交互式脚本相同的问题: >>> cur.execute('select * fr

我不知道如何解决这个问题:我的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',
当前执行('select*from'+表名1) >>>打印'\n'+str(cur.fetchall()) [(美国内布拉斯加州奥马哈/议会布拉夫斯,无,u'green')] >>>当前执行('select*from'+表名1) >>>对于cur中的行: ... data=cur.fetchone() ... 打印数据 ... 没有一个 >>>当前执行('select*from'+表名1) >>>当前执行('PRAGMA table_info('+tablename1+')) >>>data=cur.fetchall() >>>对于数据中的d: ... 打印d[0],d[1],d[2] ... 0 REGIONUPPERCASE文本 1区域文本 2红绿文本 >>>当前执行('select*from'+表名3) >>>当前执行('PRAGMA table_info('+tablename3+')) >>>data=cur.fetchall() >>>对于数据中的d: ... 打印d[0],d[1],d[2] ... 0 REGIONUPPERCASE文本 1区域文本 2红绿文本 3合作文本 4合作文本 5 CLHREF文本 >>>当前执行('select*from'+表名3) >>>对于cur中的行: ... data=cur.fetchone() ... 打印数据 ... (美国阿拉巴马州伯明翰、美国阿拉巴马州伯明翰、美国红色、美国33.5206608、u'-86.80249、u' (u'FLORENCE/MUSCLE SHOALS,美国阿拉巴马州,u'FLORENCE/MUSCLE SHOALS,美国阿拉巴马州,u'red',u'3 (u'HUNTSVILLE/DECATUR,美国阿拉巴马州,u'HUNTSVILLE/DECATUR,美国阿拉巴马州,u'red',u'34.72849' (美国阿拉巴马州蒙哥马利、美国阿拉巴马州蒙哥马利、美国红色、美国32.3668052、美国-86.2999689、, (u'ANCHORAGE/MAT-SU,美国阿拉斯加州,u'ANCHORAGE/MAT-SU,美国阿拉斯加州,u'red',u'61.34037',u'- (美国阿拉斯加州u'KENAI半岛、美国阿拉斯加州u'KENAI半岛、u'red',u'59.8785222',u'-150.3 (u'FLAGSTAFF/SEDONA,亚利桑那州,美国',u'FLAGSTAFF/SEDONA,亚利桑那州,美国',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

?我不太明白。我相信你看到我对这两个表执行的命令结构是完全相同的吗?我会一直阅读你的答案,直到我明白你的意思。哦!你是说表3中的第一行数据被跳过了?而且由于表1只有一行,看起来什么都没有?明白了!谢谢!!!@kenneth558:您正在使用
for
循环在游标对象上循环。这会产生结果。这意味着在执行此操作时,游标也会移动到下一行,因此
是数据库中的第一行,
data=cur.fetchone()
尝试检索第二行。但是您的表只有一行,因此调用返回
None