cx_Oracle:Como faço para iterar um conjunto de resultados?
Pergunta
Existem várias maneiras de iterar um conjunto de resultados.Quais são as vantagens de cada um?
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?