2012-05-15 3 views
5

SQL 쿼리를 여러 개 포함하는 .sql 파일이 있습니다. 나는이 쿼리를 파이썬을 통해 MySQLdb을 사용하여 MySQL에서 실행하려고한다.Python에서 MySQLdb를 사용하여 .sql 파일을 실행하십시오.

sqlite3 has "a nonstandard shortcut" for this purpose called executescript()이지만, MySQLdb에는 동등한 기능이없는 것으로 보입니다.

같은 것을 묻는 this old question from 2 years ago이 눈치 챘지만 답변이 만족스럽지 않습니다. 답은 기본적으로 다음과 같습니다

사용 subprocessmysql 명령을 실행하고 당신의 .SQL 파일을 보낼 수 있습니다.

이 방법이 효과적이지만 오류 처리 등으로 인해 원치 않는 복잡성이 발생합니다.

각 쿼리가 한 줄에 있으면 각 줄을 개별적으로 실행하십시오.

제 경우에는 여러 줄에 걸쳐 있기 때문에 작동하지 않습니다.

각 쿼리가 한 줄에 없으면 어떻게 든 가입하십시오.

그러나 어떻게? 제 말은, 제가 쉽게 쉽게 뭔가를 해킹 할 수 있기 때문에 여기서 반쯤 구식으로 대답 할 필요가 없으며, 아마도 그것이 제가 끝내게 될 것입니다. 그러나 이미 이것을 수행하는 확립 된 라이브러리가 있습니까? 나는 해킹보다는 포괄적이고 정확한 해결책으로 더 편하게 느낄 것입니다.

+0

:이에 대한 지원이 활성화 및/또는 지원을 비활성화되어 절대적으로 확인하려면

db = conn.cursor() db.execute('SELECT 1; SELECT 2;') more = True while more: print db.fetchall() more = db.nextset() 

는, 다음과 같이 사용할 수 있습니다 파일을 작성하고 쿼리를 작성했지만 그것이 "hack"에 의한 것이므로 삭제했다고 생각합니다. – acattle

답변

3

MySQLdb이 상자의 내용을 허용하는 것 같습니다. cursor.nextset()을 호출하면 반환 된 결과 집합을 순환해야합니다. 내가 구문 분석 invovled 답변을 제출했다

MYSQL_OPTION_MULTI_STATEMENTS_ON = 0 
MYSQL_OPTION_MULTI_STATEMENTS_OFF = 1 

conn.set_server_option(MYSQL_OPTION_MULTI_STATEMENTS_ON) 
# Multiple statement execution here... 
conn.set_server_option(MYSQL_OPTION_MULTI_STATEMENTS_OFF) 
+0

MySQL .sql 스크립트에는 mysql 클라이언트가 처리하지만 인식되지 않는 일부 [내장 명령] (http://dev.mysql.com/doc/refman/5.6/en/mysql-commands.html)이 포함되어 있습니다 서버의 SQL 파서에 의해. 따라서 MySQLdb가 다중 쿼리를 지원할 수는 있지만 임의의 .sql 스크립트를 입력으로 제공 할 수는 없습니다. –

+0

@aleksi 당신은 위험한 가정을 전제로합니다. 나는 더 작은 크기가 아닌 큰 파일 (x100MB +)에서 작동하지 않을 것이라고 생각합니다. 명령에는 발전기가 없습니다. SQL 파일 파서가 필요하기 때문에 명령 생성기를 설정하는 것조차 어렵습니다. 라인 단위로 작동하지 않을 수도 있습니다. 세미콜론으로 spliiting 나쁜 것입니다. –

+0

@BerryTsakala : 귀하의 의견을 이해하는 데 정말로 힘든 시간을 보내고 있습니다. 그것이 말했다. 네, 전 가정을합니다.이 방법은 모든 유스 케이스 (위의 Bill이 이미 잘 지적한 바와 같이)에서는 작동하지 않지만,이 질문이 무엇을 요구했는지는 다소 정확합니다. 그리고 지구상에서 "위험한"의미는 무엇입니까? 이것은 SQL 쿼리를 직접 파싱하는 것과는 달리 매우 안전합니다. 네, 대용량 파일에서는 작동하지 않습니다. MySQL 최대 패킷 크기에 부딪칩니다. 왜이 방법은 명시 적으로 ** ** 피하기 때문에 SQL 구문 분석에 대해 이야기하고 있습니까? –

관련 문제