質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

1回答

7240閲覧

python mysql-connector利用時の 複数sqlの実行が上手くいきません

hiroshi77

総合スコア12

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/05/08 13:19

python mysql.connectorを利用し、sqlを実行する時に、一つずつexecuteすると上手くいくのですが、複数のsqlを実行する時に失敗します。エラーは表示されずに、単にデータが入らいない状態です。ドキュメントを見る限りmulti=Trueとすれば、上手くいくはずなのですが、原因が不明です。
成功するコードと失敗するコードの違いは、
"truncate table jockey_seiseki;" を一緒のsql文に入れるか入れないかになります。

どなたかご教授頂ければ幸いです。

※成功するコード(一つずつsqlを実行)

python

1# 成功するコード 2import mysql.connector 3cnx = mysql.connector.connect(host="localhost", 4 user="root", 5 password="root", 6 database='everydb2') 7 8cursor = cnx.cursor() 9cursor = cnx.cursor(buffered=True) 10print(cursor) 11hizuke = "2021-04-01"; 12 13# 単独で実行 14cursor.execute("""truncate table jockey_seiseki;""") 15 16operation = ( 17 18""" 19INSERT INTO jockey_seiseki(kisyucode,name,Year,MonthDay, JyoCD ,RaceNUm,KakuteiJyuni,winloss,tyakugai,rengai,Ninki) 20SELECT 21 T1.KisyuCode as `騎手コード`, 22 T1.KisyuRyakusyo, 23 T1.Year as `開催年`, 24 T1.MonthDay as `開催月日`, 25 T1.JyoCD as `競馬場コード`, 26 T1.RaceNum as `レース番号`, 27 T1.KakuteiJyuni as `確定着順`, 28 CASE T1.KakuteiJyuni 29 WHEN '01' THEN true 30 ELSE false END as `勝敗フラグ`, 31 CASE T1.KakuteiJyuni 32 WHEN '01' THEN true 33 WHEN '02' THEN true 34 WHEN '03' THEN true 35 ELSE false END as `着外フラグ`, 36 CASE T1.KakuteiJyuni 37 WHEN '01' THEN true 38 WHEN '02' THEN true 39 ELSE false END as `連外フラグ`, 40 T1.Ninki from N_UMA_RACE as T1 41 where T1.KakuteiJyuni > 0 and T1.DataKubun = '7' 42 and str_to_date(concat(Year,MonthDay) ,'%Y%m%d') >= %s 43 order by Year,MonthDay; 44"""); 45 46x = cursor.execute(operation,(hizuke,)) 47

失敗するコード(複数sqlを実行)

python

1# 失敗するコード 2import mysql.connector 3cnx = mysql.connector.connect(host="localhost", 4 user="root", 5 password="root", 6 database='everydb2') 7 8# hizuke = "2021-04-01"; 9 10operation = (""" 11truncate table jockey_seiseki; 12INSERT INTO jockey_seiseki(kisyucode,name,Year,MonthDay, JyoCD ,RaceNUm,KakuteiJyuni,winloss,tyakugai,rengai,Ninki) 13SELECT 14 T1.KisyuCode as `騎手コード`, 15 T1.KisyuRyakusyo, 16 T1.Year as `開催年`, 17 T1.MonthDay as `開催月日`, 18 T1.JyoCD as `競馬場コード`, 19 T1.RaceNum as `レース番号`, 20 T1.KakuteiJyuni as `確定着順`, 21 CASE T1.KakuteiJyuni 22 WHEN '01' THEN true 23 ELSE false END as `勝敗フラグ`, 24 CASE T1.KakuteiJyuni 25 WHEN '01' THEN true 26 WHEN '02' THEN true 27 WHEN '03' THEN true 28 ELSE false END as `着外フラグ`, 29 CASE T1.KakuteiJyuni 30 WHEN '01' THEN true 31 WHEN '02' THEN true 32 ELSE false END as `連外フラグ`, 33 T1.Ninki from N_UMA_RACE as T1 34 where T1.KakuteiJyuni > 0 and T1.DataKubun = '7' 35 and str_to_date(concat(Year,MonthDay) ,'%Y%m%d') >= %s 36 order by Year,MonthDay; 37"""); 38 39 40x = cursor.execute(operation,(hizuke,),multi=True) 41 42

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ドキュメントには「そんなにうまく動かんから気をつけろ」と書いてあるようです。

If multi is set to True, execute() is able to execute multiple statements specified in the operation string. It returns an iterator that enables processing the result of each statement. However, using parameters does not work well in this case, and it is usually a good idea to execute each statement on its own.

MySQL :: MySQL Connector/Python Developer Guide :: 10.5.4 MySQLCursor.execute() Method

  • パラメータはまともに機能しない
  • 文ごとに実行する方がおすすめだよ!

投稿2021/05/08 13:33

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiroshi77

2021/05/11 00:15

ライブラリ自体の問題ということですね。ずっとハマり続けるところでした。どうもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問