Pergunta

Existem várias maneiras de iterar um conjunto de resultados.Quais são as vantagens de cada um?

Foi útil?

Solução

A maneira canônica é usar o iterador de cursor integrado.

curs.execute('select * from people')
for row in curs:
    print row

Você pode usar fetchall() para obter todas as linhas de uma vez.

for row in curs.fetchall():
    print row

Pode ser conveniente usar isso para criar uma lista Python contendo os valores retornados:

curs.execute('select first_name from people')
names = [row[0] for row in curs.fetchall()]

Isso pode ser útil para conjuntos de resultados menores, mas pode ter efeitos colaterais ruins se o conjunto de resultados for grande.

  • Você deve esperar que todo o conjunto de resultados seja devolvido ao processo do seu cliente.

  • Você pode consumir muita memória em seu cliente para manter a lista de incorporação.

  • Pode demorar um pouco para o Python construir e desconstruir a lista que você descartará imediatamente de qualquer maneira.


Se você sabe que há uma única linha sendo retornada no conjunto de resultados, você pode chamar fetchone() para obter a única linha.

curs.execute('select max(x) from t')
maxValue = curs.fetchone()[0]

Finalmente, você pode percorrer o conjunto de resultados buscando uma linha por vez.Em geral, não há nenhuma vantagem específica em fazer isso em vez de usar o iterador.

row = curs.fetchone()
while row:
    print row
    row = curs.fetchone()

Outras dicas

Minha maneira preferida é o iterador do cursor, mas definindo primeiro a propriedade arraysize do cursor.

curs.execute('select * from people')
curs.arraysize = 256
for row in curs:
    print row

Neste exemplo, cx_Oracle irá buscar linhas do Oracle 256 linhas por vez, reduzindo o número de viagens de ida e volta da rede que precisam ser realizadas

Há também o caminho psyco-pg parece que faz isso...Pelo que entendi, parece criar proxies de linha semelhantes a dicionário para mapear a pesquisa de chave no bloco de memória retornado pela consulta.Nesse caso, buscar a resposta completa e trabalhar com uma fábrica de proxy semelhante nas linhas parece uma ideia útil.Pensando bem, parece mais Lua do que Python.

Além disso, isso deve ser aplicável a todos PEP-249 DBAPI2.0 interfaces, não apenas Oracle, ou você quis dizer apenas o mais rápido usando Oráculo?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top