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

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

ただいまの
回答率

90.34%

  • Python 3.x

    7389questions

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

  • MySQL

    6166questions

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

  • 並列処理

    39questions

    複数の計算が同時に実行される手法

python並列処理でMysqlへインサート

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 690

morningglow

score 65

pythonでjoblibを使って並列処理でMYSQLへインサートを行いたいのですが、以下のエラーが発生してうまくインサートできません。

ProgrammingError: unsupported operand type(s) for %: 'NoneType' and 'tuple'

プログラムは以下の感じです。

from joblib import Parallel, delayed
import MySQLdb

con = MySQLdb.connect(host="hoge", user="hoge", passwd="hoge", db="hoge", charset="hoge")
cur = con.cursor()

tokens = ["hoge","hoge","hoge","hoge","hoge"]

def insToken(token):
    cur.execute("insert into hoge (hoge) value (%s)  ",('1'))

Parallel(n_jobs=-1)( [delayed(insToken)(token) for token in tokens] )

本当はtokens内の情報をインサートしたいのですが、1をインサートした場合でも上記エラーで落ちます。  
この時、1は複数インサートされるのですが、何回めかの並列処理で上記エラーにより落ちているようです。  
並列処理でなければインサートできます。  
MySQLでは同一テーブルへの同時書き込みは可能(順次インサートされる)だと考えているのですが、そもそもこの動作は不可能なのでしょうか?
お分かりのおりましたら、ご教授お願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

tokensの中身に問題があるだけのように見受けられますが。
例えば、

tokens = ["1","1","1","1","1"]

def insToken(blogSeq,subSeq,token):
    cur.execute("insert into hoge (hoge) value (%s)  " % token)

でも同じエラーが出ますか?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/10 02:29

    回答ありがとうございます。
    tokensは配列数分、並列処理しているだけで、中身はなんでも良いと考えていますが間違っているでしょうか?
    上記のようにtokensを修正した場合でも、同じようにエラーになります。

    また、下記の部分で最初の2,3並列処理の動作はインサートされるので、並列処理の部分に問題があると考えているのですが。
    ```
    def insToken(token):
    cur.execute("insert into hoge (hoge) value (%s) ",('1'))
    ```

    キャンセル

  • 2017/09/10 02:36 編集

    なるほど、私はむしろ

    ```
    Parallel(n_jobs=-1)( [delayed(insToken)(token) for token in tokens] )
    ```

    こちらの処理で、tokensの中身がうまく取れないデータがある為
    エラーで落ちていると考えておりました。

    エラーが出力された行数は cur.execute 側でしょうか?
    それともParallel側でしょうか。

    キャンセル

  • 2017/09/10 03:28

    こちらでテスト環境を作ってみましたが、エラーは発生しませんでした。
    ・OS Cent OS 6.9
    ・Python 3.5.4
    ・mysql Ver 14.14 Distrib 5.1.73, for redhat-linux-gnu (x86_64) using readline 5.1

    pip
    joblib (0.11)
    mysqlclient (1.3.12)

    コード
    from joblib import Parallel, delayed
    import MySQLdb

    con = MySQLdb.connect(host="127.0.0.1", user="root", passwd="asdf", db="test")
    cur = con.cursor()

    tokens = ["1","2","3","4","5"]

    def insToken(token):
    cur.execute("insert into test3 values('hoge',%s) " % token )

    Parallel(n_jobs=-1)( [delayed(insToken)(token) for token in tokens] )

    mysqlのテーブル

    mysql> create table test3(hoge varchar(5), name varchar(50));

    mysql> select * from test3;
    +------+-------+
    | hoge | name |
    +------+-------+
    | hoge | 1 |
    | hoge | 2 |
    | hoge | 3 |
    | hoge | 4 |
    | hoge | 5 |
    +------+-------+
    5 rows in set (0.00 sec)

    コードは特に問題なさそうですので、疑わしきは
    ・mysqlのバージョン、
    ・tokenデータ
    どちらかです。

    キャンセル

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

  • ただいまの回答率 90.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python 3.x

    7389questions

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

  • MySQL

    6166questions

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

  • 並列処理

    39questions

    複数の計算が同時に実行される手法