0

我在尝试简单地从 db (sqlite3) 的行中执行数据时遇到问题。DB 输入有 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 方式。有没有更好的方法来完成这项工作?任何帮助将不胜感激。

4

1 回答 1

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)
于 2013-03-15T20:12:08.037 回答