从db执行结果时索引超出范围

时间:2013-03-15 20:03:07

标签: python sqlite execute indexing

我在尝试简单地从db(sqlite3)的行执行数据时遇到了问题。数据库输入有4个字段,因此一旦输入,它们就会被保存。但这是我的问题,我执行所有4行,如果其中一个字段没有填充我得到一个错误。

这是数据库执行代码:

def ids(self):
    con = lite.connect('foo.db')

    with con:

        cur = con.cursor()    
        cur.execute("SELECT Id FROM foo")

    while True:

        ids = cur.fetchall()

        if ids == None:
            continue

        return ids

由于有4行,我的输出代码为:

 print ''.join(ids[0]) + ',' + ''.join(ids[1]) + ',' + ''.join(ids[2])
 + ',' + ''.join(ids[3])

所以我的问题是当没有现有的行没有显示任何东西并且只留下实际存在的那些时,如何做出异常?我尝试过做if ids[0] is not None: #do something,但这会让我的代码变得非常慢,而且我认为它是非pythonic方式。有没有更好的方法来做这项工作?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您似乎没有4行。使它成为通用的,只需加入任意数量的行:

ids = someobject.ids()
print ','.join(''.join(row) for row in ids)

您可以简化数据库查询,无需“轮询”查询:

def ids(self):
    with lite.connect('foo.db') as con:
        cur = con.cursor()    
        cur.execute("SELECT Id FROM foo")
        return cur.fetchall()

您也可以直接在光标上循环,数据库将在您获取时处理缓冲:

def ids(self):
    with lite.connect('foo.db') as con:
        cur = con.cursor()    
        cur.execute("SELECT Id FROM foo")
        return cur   # just the cursor, no fetching

ids = someobject.ids()
# this'll loop over the cursor, which yields rows as required
print ','.join(''.join(row) for row in ids)