cx_Oracle: Como faço para interagir sobre um conjunto de resultados?

votos
35

Existem várias maneiras para iterar sobre um conjunto de resultados. O que são a troca de cada um?

Publicado 03/08/2008 em 02:15
fonte usuário
Em outras línguas...                            


3 respostas

votos
35

A forma canônica é usar o iterador cursor embutido.

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

Você pode usar fetchall()para obter todas as linhas de uma só 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()]

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

  • Você tem que esperar para todo o conjunto de resultados para ser devolvido ao seu processo de cliente.

  • Você pode comer um monte de memória no seu cliente para armazenar a lista construída.

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


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

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

Finalmente, você pode varrer o conjunto de resultados buscar uma linha de cada vez. Em geral, não há nenhuma vantagem particular em fazer isso ao longo usando o iterador.

row = curs.fetchone()
while row:
    print row
    row = curs.fetchone()
Respondeu 03/08/2008 em 02:17
fonte usuário

votos
21

Meu caminho preferencial é o iterador cursor, mas a definição primeira propriedade ArraySize do cursor.

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

Neste exemplo, cx_Oracle vai buscar linhas da Oracle 256 linhas de cada vez, reduzindo o número de viagens de ida de rede que precisam ser executadas

Respondeu 24/09/2008 em 03:51
fonte usuário

votos
4

Há também o caminho psyco-pgparece fazê-lo ... Pelo que pude perceber, parece criar dicionário-como linha-proxies para mapear lookup chave no bloco de memória retornado pela consulta. Nesse caso, buscando a resposta completa e trabalhar com um proxy-fábrica semelhante sobre as linhas parece idéia útil. Venha para pensar sobre isso, porém, ele se sente mais como Lua do que Python.

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

Respondeu 24/08/2008 em 18:28
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more