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

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

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

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

Q&A

解決済

2回答

2156閲覧

Pythonで複数のCREATE文を一括で実行する場合について

limitman80

総合スコア40

Python 3.x

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

1グッド

1クリップ

投稿2018/04/14 08:03

PythonでCreate tableのSQL文をexecuteする方法がわからず困ってます。
単純にCreate tableを1回実行する場合は問題なく出来るのですが、
複数のCreate tableを実行する場合にsyntax errorが発生してしまいます。
それぞれのCreate文は問題なく実行できるので、1個目のCreate tableと2個目のCreate tableの間の区切りが間違ってるのかもしれません。

Create table *****; Create table ****;
Create table ***** Create table ****

等を試したのですがダメでした。
そもそも一括で複数のCreate tableを実行するのはできないのでしょうか?

ちなみにサーバ機はLinuxになります。
わかる方がいればお願いします。

YouheiSakurai👍を押しています

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

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

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

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

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

limitman80

2018/04/14 08:52

PyMySQLになります。
limitman80

2018/04/14 11:30

executeを試したけどダメでした。executemanyというのがあるんですか。知りませんでした。調べてみます。
guest

回答2

0

ベストアンサー

◇実行環境
OS:Windows 10
Anaconda3
mysql.connector

Cursor#executeの引数にmulti=Trueが必要でした。
Create Tablelistに入れて";".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

投稿2018/04/14 08:53

編集2018/04/16 08:57
umyu

総合スコア5846

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

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

limitman80

2018/04/16 01:44

上記を試すと got an unexpected keyword argument 'multi' が出てしまいます。 multiは使えないってことでしょうか?
guest

0

Python CREATE TABLE 実行

といったキーワードでググれば方法は見つかるでしょうけど、
データベースによってユーテリティ名は違いますが、だいたいのデータベースではSQLを実行できるソフトが提供されています。OracleですとSQL*Plusというソフトで必要なCREATE TABLE文を個々にでもまとめてでも実行できます。CREATE INDEXで索引を追加したり、 ALTER TABLE でテーブルの変更をしたりすることもありますから、PythonでわざわざCREATE TABLEを実行するコードを書く必要性を感じたことは一度もありません。

投稿2018/04/14 08:20

Orlofsky

総合スコア16415

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

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

limitman80

2018/04/14 08:31

データベースはMySQLです。 >PythonでわざわざCREATE TABLEを実行するコードを書く必要性を感じたことは一度もありません。 必要なシステムを作成しているから必要なんです。必要かどうかは判断してもらわなくても全然かまいません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問