У меня проблема при попытке просто выполнить данные из строк из 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, но это сделало бы мой код очень медленным, и я думаю, это не питонический путь. Есть ли лучший способ заставить это работать? Любая помощь будет оценена по достоинству.

0
maikati 16 Мар 2013 в 00:03
Где «выходной код» по отношению к другому коду? Сразу под ним?
 – 
Hoopdady
16 Мар 2013 в 00:08
Выходной код не ниже, а выше. Но какое это имеет значение? Идентификаторы как функция находятся под выводом, но я могу изменить их, если это имеет значение.
 – 
maikati
16 Мар 2013 в 00:09
Почему while True? Нет необходимости повторять вызов fetchall.
 – 
Martijn Pieters
16 Мар 2013 в 00:10
Просто return cur.fetchall() подойдет.
 – 
Martijn Pieters
16 Мар 2013 в 00:10
Можете ли вы поместить в пример полный код? Я вижу, что ваше имя переменной и имя функции или то же самое, просто интересно, есть ли здесь проблемы с пространством имен.
 – 
Hoopdady
16 Мар 2013 в 00:11

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)
1
Martijn Pieters 16 Мар 2013 в 00:12
Да, я попробую через секунду. Честно говоря, думал о чем-то подобном, надеюсь, это сработает.
 – 
maikati
16 Мар 2013 в 00:13
Да, сработало, спасибо! Я сделал ваш третий пример, и теперь он отлично работает! Еще раз спасибо, чувак
 – 
maikati
16 Мар 2013 в 00:25