2017-04-04 3 views
0

이 재생 된 샘플입니다 가까운 커서 쿼리 루프를 실행합니다파이썬 MySQL은

import mysql.connector 

conn = mysql.connector.connect(
    user='root', password='12347', 
    host='localhost') 

def getCursor(): 
    return conn.cursor() 

def execQuery(cursor=getCursor()): 
    cursor.execute("SELECT 2") 
    cursor.fetchall() 
    cursor.close() 

for i in range(4): 
    cursor = execQuery() 

이 코드는 cursor.close()없이 작동합니다. 하지만 제가 이상한 찾으이 샘플은 간단한 변화() cursor.close로도 작동한다는 것입니다 :

def execQuery(): 
    cursor=getCursor() 
    cursor.execute("SELECT 2") 
    cursor.fetchall() 
    cursor.close() 

함수의 본체에 기본 매개 변수를 이동하여.

커서를 닫는 것이 가장 좋은 방법인지 모르겠으므로 첫 번째 양식을 유지하면서 커서를 닫을 수 있습니다. 함수의 반환 값을 사용하는 기본 매개 변수를 사용하는 것이 가장 좋은 방법이 아닌 경우 두 번째 형식을 사용할 수 있습니다. 그러나 나는 그들이 다르게 행동하는 이유에 원하는 나는 다음과 같은 오류가 있어요처럼입니다

:

cursor.execute("SELECT 2") 
cursor.fetchall() 
cursor.close() 
cursor.execute("SELECT 2") 

이 차단됩니다 그래서, ExecQuery에의 모든 호출이 동일한 커서를 사용하고 같은거야 두 번째 전화에서 바로.

답변

0

데이터베이스에 연결해야 할 때 커서와 같은 것이 필요합니다. 결과를 가져 오려면 커서 객체가 필요합니다.

범위 (4)에서 루프를 실행할 때 샘플 프로그램에서 execQuery()을 호출합니다. 정의를 보면 def execQuery(cursor=getCursor()): 함수는 커서로 입력을받으며 기본적으로 루프가 실행될 때 커서를 모두 생성하는 getCursor() 함수를 사용했습니다.

프로그램에서 커서를 닫지 만 다시 만들지 않으면 두 번째 실행 쿼리가 오면 커서가 나타나지 않고 프로그램에서 오류가 발생합니다.

+0

답변 해 주셔서 감사합니다. 나는 '모든 것을 커서로 만드는 기능'이 '커서가 될 때마다'라고 생각한다. – user3290525

+0

어쨌든 당신의 대답에서 이해할 수있는대로,'execQuery'가 루프에서 호출 될 때마다 커서가 생성됩니다. 그런 다음 커서를 닫고 다시 만들지 말라. 'execQuery'가 두 번 실행될 때, 커서가 닫혀 있었기 때문에 커서가 생성되지 않는다는 말입니까? 왜 다시 만들어지지 않았는지 말해 줄 수 있니? – user3290525