◇実行環境
OS:Windows 10
Anaconda3
mysql.connector
Cursor#execute
の引数にmulti=True
が必要でした。
Create Table
はlist
に入れて";".join()
するほうが問題が発生しないかもです。
実行sqlをprint
して手で実行して確認してみてはどうでしょうか。
以下はサンプルソースコードです。
Python
1# -*- coding: utf8 -*-
2from contextlib import closing
3import json
4# pip install mysql-connector-python-rf
5import mysql.connector
6
7
8def connect():
9 with open('settings.json', encoding='utf-8-sig') as f:
10 json_data = json.load(f)
11 con_str = json_data['connection_strings']
12 print(con_str)
13 return mysql.connector.connect(**con_str)
14
15
16def main() -> None:
17 with closing(connect()) as conn:
18 with closing(conn.cursor()) as cur:
19 for _ in cur.execute("create table sampleA (id int, rnd int);create table sampleB (id int, rnd int);", multi=True):
20 pass
21 conn.commit()
22
23
24if __name__ == '__main__':
25 main()
26
2018/04/16追記
接続ドライバはPyMySQLだったのですね。動作確認していませんが、こんな感じでどうでしょうか。
# -*- coding: utf8 -*-
from contextlib import closing
import json
# pip install PyMySQL
import pymysql
from pymysql.constants.CLIENT import MULTI_STATEMENTS
def connect():
return pymysql.connect(host='localhost',
user='root',
password='',
db='testdb',
client_flag=MULTI_STATEMENTS)
def main() -> None:
with closing(connect()) as conn:
with closing(conn.cursor()) as cur:
cur.execute("select 1;create table sampleA (id int, rnd int);create table sampleB (id int, rnd int);")
while True:
print(cur.fetchall())
if not cur.nextset():
break
conn.commit()
if __name__ == '__main__':
main()
◇参考情報
Hang when the second command in a multi-statement fails