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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3346閲覧

Pythonでのmysql操作について(前回の質問の続き)

u_k_statistics

総合スコア44

MySQL

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2016/09/12 07:15

前回の質問の続きで申し訳ないのですが、pythonでmySQLにデータを入れようと思い、以下のコードを書いたのですが、実行されませんでした。

comma = ',' db_final = [[11,12],[21,22],[31,32],[41,42],[51,52]] connect = mysql.connector.connect( user='root', password='', host='xxxx') cursor = connect.cursor() for j in range(1,3): sql = 'insert into database.0912 (hc,pc) values ' for i in range(5*(j-1),5*(j-1) + 1): sql2 = '(db_final[' + str(i) + '][0],db_final[' + str(i) + '][1])' sql = sql + sql2 for i in range(5*(j-1) + 1,5*j): sql2 = '(db_final[' + str(i) + '][0],db_final[' + str(i) + '][1])' sql = sql + comma + sql2 print sql cursor.execute(sql) connect.commit() # cursor.close() # connect.close() cursor.close() connect.close()

以下エラーコード

insert into database.0912 (hc,pc) values (db_final[0][0],db_final[0][1]),(db_final[1][0],db_final[1][1]),(db_final[2][0],db_final[2][1]),(db_final[3][0],db_final[3][1]),(db_final[4][0],db_final[4][1]) Traceback (most recent call last): File "test111.py", line 75, in <module> cursor.execute(sql) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mysql/connector/cursor.py", line 507, in execute self._handle_result(self._connection.cmd_query(stmt)) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mysql/connector/connection.py", line 722, in cmd_query result = self._handle_result(self._send_cmd(ServerCmd.QUERY, query)) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mysql/connector/connection.py", line 640, in _handle_result raise errors.get_exception(packet) mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '[0][0],db_final[0][1]),(db_final[1][0],db_final[1][1]),(db_final[2][0],db_final[' at line 1 [Finished in 0.1s with exit code 1]

前回質問させていただいた際の回答を参考にさせてもらい作成したプログラムは実行されたのですが、挿入するデータを文字列(?)から変数に変更したところこのようになってしまいました。
どなたか原因がわかる方よろしくお願いします。

前回のコード

comma

1connect = mysql.connector.connect( 2 user='root', 3 password='', 4 host='xxxx') 5cursor = connect.cursor() 6for j in range(1,3): 7 sql = 'insert into database.0912 (hc,pc) values ' 8 9 10 for i in range(5*(j-1),5*(j-1) + 1): 11 sql2 = '(123,123)' 12 sql = sql + sql2 13 14 15 for i in range(5*(j-1) + 1,5*j): 16 sql2 = '(234,234)' 17 sql = sql + comma + sql2 18 print sql 19 cursor.execute(sql) 20 connect.commit() 21 # cursor.close() 22 # connect.close() 23 24 25 26cursor.close() 27connect.close()

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下のSQL文を実行しようとして、エラーとなっています。
insert into database.0912 (hc,pc) values (db_final[0][0],db_final[0][1])
正しいSQL文は、"(db_final[0][0], db_final[0][1])"ではなく、(11, 12)などではないでしょうか。まずは、どのようなSQL文を発行したいのか考えましょう。
また、forループの回数が適切でないので、インデックスの値がオーバーします。
(途中でlist index out of rangeが出て失敗する。)

全てのdb_finalを挿入したいなら、以下のコードになります。

python

1# -*- coding: utf-8 -*- 2import mysql.connector 3conn = mysql.connector.connect( 4 user='root', 5 password='', 6 host='xxxx', 7 db='database') # db名まで指定した方が良い 8cursor = conn.cursor() 9# table名は"0912" 10insert_stmt = 'INSERT INTO `0912` (hc, pc) VALUES (%s, %s)' 11 12db_final = [(11, 12), (21, 22), (31, 32), (41, 42), (51, 52)] 13 14# cursor.execute("DROP TABLE `0912`") 15# cursor.execute("CREATE TABLE `0912`('hc' INTEGER, 'pc' INTEGER)") 16 17cursor.executemany(insert_stmt, db_final) 18cursor.close() 19conn.commit() 20conn.close()

投稿2016/09/12 17:58

EloiseSeverin

総合スコア50

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

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

u_k_statistics

2016/09/13 10:25

EloiseSeverinさん 回答ありがとうございます。 おかげさまで上のコードは実行できたのですが、今度はそれをより大きなリストで行おうと思い実行したところ、エラーが出てしまいました。 内容は以下の通りで、調べたところ接続エラーのようなのですが、なにかこれを避ける方法はないでしょうか? よろしくお願いします。 Traceback (most recent call last): File "test.py", line 529, in <module> cursor.executemany(insert_stmt, db_final) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mysql/connector/cursor.py", line 608, in executemany return self.execute(stmt) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mysql/connector/cursor.py", line 507, in execute self._handle_result(self._connection.cmd_query(stmt)) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mysql/connector/connection.py", line 722, in cmd_query result = self._handle_result(self._send_cmd(ServerCmd.QUERY, query)) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mysql/connector/connection.py", line 504, in _send_cmd packet_number) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mysql/connector/network.py", line 133, in send_plain errno=2055, values=(self.get_address(), _strioerror(err))) mysql.connector.errors.OperationalError: 2055: Lost connection to MySQL server at 'xxxxxxxxxx', system error: 32 Broken pipe [Finished in 633.7s with exit code 1] またこの前に出たエラーは記録してないのですが、 41 Protocol wrong type for socket のようなものが出ました。 よろしくお願いします。
u_k_statistics

2016/09/13 11:42

ちなみにプログラムの全体は 外付けHDDからtxtデータを取得 そのデータをデータベースに挿入したい形に変えてリストに入れる そのリストをデータベースに入れる という内容です。
u_k_statistics

2016/09/14 08:56

1000行単位で挿入するようにしたところ解決しました。 ありがとうございました!!
EloiseSeverin

2016/09/14 10:34

executemany()は、リスト全体を一度に処理するためリストが大きすぎると処理できません。 リスト1行毎に処理する正解例を示すならば、 # cursor.executemany(insert_stmt, db_final) # この行をコメントアウトして for data in db_final: cursor.execute(insert_stmt, data) です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問