cx_오라클:결과 세트를 어떻게 반복합니까?
문제
결과 세트를 반복하는 방법에는 여러 가지가 있습니다.각각의 장단점은 무엇입니까?
해결책
표준적인 방법은 내장 커서 반복자를 사용하는 것입니다.
curs.execute('select * from people')
for row in curs:
print row
당신이 사용할 수있는 fetchall()
한 번에 모든 행을 가져옵니다.
for row in curs.fetchall():
print row
이를 사용하여 반환된 값을 포함하는 Python 목록을 만드는 것이 편리할 수 있습니다.
curs.execute('select first_name from people')
names = [row[0] for row in curs.fetchall()]
이는 작은 결과 집합에 유용할 수 있지만 결과 집합이 크면 나쁜 부작용이 있을 수 있습니다.
전체 결과 세트가 클라이언트 프로세스로 반환 될 때까지 기다려야합니다.
내장 목록을 보유하기 위해 고객에게 많은 기억을 먹을 수 있습니다.
파이썬이 어쨌든 즉시 버릴 목록을 구성하고 해체하는 데 시간이 걸릴 수 있습니다.
결과 세트에 단일 행이 반환된다는 것을 알고 있는 경우 다음을 호출할 수 있습니다. fetchone()
단일 행을 얻으려면.
curs.execute('select max(x) from t')
maxValue = curs.fetchone()[0]
마지막으로 한 번에 한 행을 가져오는 결과 집합을 반복할 수 있습니다.일반적으로 이 작업을 수행하면 반복자를 사용하는 것보다 특별한 이점이 없습니다.
row = curs.fetchone()
while row:
print row
row = curs.fetchone()
다른 팁
내가 선호하는 방법은 커서 반복자이지만 커서의 arraysize 속성을 먼저 설정하는 것입니다.
curs.execute('select * from people')
curs.arraysize = 256
for row in curs:
print row
이 예에서 cx_Oracle은 한 번에 Oracle 256개 행에서 행을 가져와 수행해야 하는 네트워크 왕복 횟수를 줄입니다.
방법도 있어요 psyco-pg
할 것 같다...내가 수집한 바에 따르면 키 조회를 쿼리에서 반환된 메모리 블록에 매핑하기 위해 사전과 같은 행 프록시를 만드는 것 같습니다.이 경우 전체 답변을 가져오고 행에 대해 유사한 프록시 팩토리를 사용하여 작업하는 것이 유용한 아이디어처럼 보입니다.그런데 생각해보면 Python보다는 Lua에 더 가까운 느낌이 듭니다.
또한 이는 모든 사람에게 적용되어야 한다. PEP-249 DBAPI2.0 Oracle뿐만 아니라 인터페이스를 의미합니까? 가장 빠른 사용하여 신탁?