Как использовать понимание списка Python (или такое) для получения строк при использовании MySQLdb? - PullRequest
2 голосов
/ 16 апреля 2010

Я часто использую MySQLdb при работе с моим веб-сервером. Я часто повторяю слова:

row = cursor.fetchone()
while row:
    do_processing(row)
    row = cursor.fetchone()

Каким-то образом это кажется мне несколько непитонным. Есть ли лучший однострочный способ сделать то же самое, в соответствии со строками внутри C:

while (row = do_fetch()) { 
    do_processing(row); 
} 

Я пытался выяснить синтаксис, используя списки, но я не могу понять это. Любые рекомендации?

Спасибо

Эрик

Ответы [ 4 ]

2 голосов
/ 16 апреля 2010

MySQLdb курсоры являются итеративными:

cursor.execute(sql,args)
for row in cursor:
    do_processing(row)
2 голосов
/ 16 апреля 2010

На самом деле нет способа вовлечь в это понимание списка. Вам нужен цикл, который заканчивается, когда возвращается значение часового. К счастью, Python обеспечивает это:

for row in iter(cursor.fetchone, None):
    process(row)

С двумя аргументами iter() принимает вызываемое и значение часового, которое завершит итерацию. Это немного изотерически, поэтому мало кто будет жаловаться, если вы вместо этого будете использовать все еще более распространенное:

while True:
    row = cursor.fetchone()
    if row is None:
        break
    process(row)

(И действительно, этот стиль был обычным даже для построчного чтения файла, прежде чем мы сделали обобщенную итерацию.)

Некоторые модули DB-API (включая, по-видимому, теперь MySQLdb) также делают итераторы непосредственно итерируемыми, например:

for row in cursor:
    process(row)

Это, очевидно, самое красивое решение, когда оно доступно:)

0 голосов
/ 16 апреля 2010

SQLalchemy имеет набор методов, которые обеспечивают более питонную конструкцию для большого числа ваших вариантов использования, включая создание итераций, которые «ленивы» при доступе к базе данных.

0 голосов
/ 16 апреля 2010

А как же:

for row in cursor.fetchall():
    # do something with row
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...