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

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

ただいまの
回答率

90.40%

  • MySQL

    7264questions

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

  • Python 2.7

    1487questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

python MySQLdbの利用について

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 721

JunMatsumoto

score 67

python2.7でMySQLにINSTERを行いたいのですが、上手くデータが入りません。
型が違うなどのエラー等も出ていない為、何故データが入らないのか不明なので、ご教示頂ければと思います。

mysql_connnect.py

#!/usr/bin/env python
# coding: utf-8

import MySQLdb
import yaml

CONFIG_FILE = "/Path/To/conf/dbconf.yaml"

f = open(CONFIG_FILE, 'r')
dbconf = yaml.load(f)
f.close()

class Mysql_con(object):
    def __init__(self,query):
        self.query   = query

    def execute(self):
        result = []
        connection   = MySQLdb.connect(
            host     = dbconf["dbhost"],
            db       = dbconf["dbname"],
            port     = dbconf["port"],
            user     = dbconf["user"],
            passwd   = dbconf["pass"] )

        con = connection.cursor()
        con.execute(self.query)

        for record in con.fetchall():
            result.extend(record)
            print result
        return result

        con.close()
呼び出し側

        query = "insert into aws_rds (project ,instance_name ,instance_type ,strage ,engine) \
        values (\'{project}\' , \'{instance_name}\' , \'{instance_type}\' , \'{strage}\' , \'{engine}\') \
        on duplicate key update \
        project          = \'{project}\' \
        ,instance_name   = \'{instance_name}\' \
        ,instance_type  = \'{instance_type}\' \
        ,strage         = \'{strage}\' \
        ,engine         = \'{engine}\'".format \
        ( project=rows[0], instance_name=rows[1], instance_type=rows[2], strage=rows[3], engine=rows[4] )

        add = Mysql_con(query)
        add.execute()

AWSのRDSインスタンスの状態を取得するスクリプトですが、
mysqlのクエリログには、適切にクエリが生成され発行されているようでした。
※ クエリログに記載されたSQL文を、コピペして実行するとデータが追加されます。

mysql> desc aws_rds;
+---------------+--------------+------+-----+---------+----------------+
| Field         | Type         | Null | Key | Default | Extra          |
+---------------+--------------+------+-----+---------+----------------+
| id            | int(11)      | NO   | PRI | NULL    | auto_increment |
| project       | varchar(100) | NO   | MUL | NULL    |                |
| instance_name | varchar(250) | NO   |     | NULL    |                |
| instance_type | varchar(250) | NO   |     | NULL    |                |
| strage        | int(11)      | NO   |     | NULL    |                |
| engine        | varchar(100) | NO   |     | NULL    |                |
+---------------+--------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)
mysql_query.log

2248 Connect   root@localhost on DB名
2248 Query     set autocommit=0
2248 Query     insert into aws_rds (project ,instance_name ,instance_type ,strage ,engine)         values ('test-project' , 'dev-db001' , 'db.r3.large' , '1' , 'aurora')         on duplicate key update         project          = 'test-project'         ,instance_name   = 'dev-db001'         ,instance_type  = 'db.r3.large'         ,strage         = '1'         ,engine         = 'aurora'
2248 Quit

以上、宜しくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

ログをみて、ぱっと思いつく感じでは、

  • MySQLサーバーがオートコミットがオフになっている
  • INSERT実行後にcommitをしていない

という2点が原因となって、INSERTしたものがロールバックされているように見えます。

#!/usr/bin/env python
# coding: utf-8

import MySQLdb

# (略)

class Mysql_con(object):
    def __init__(self,query):
        self.query   = query

    def execute(self):
        # (略)

        con = connection.cursor()
        con.execute(self.query)
        connection.commit()  # <-- ここで、INSERTクエリをcommitする

        # (略)

上記のように、途中で明示的にcommit()を実行することで解消はするかと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/11/29 15:41

    connection.commit()を挟むことでデータが入りました。
    ありがとうございました!

    キャンセル

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

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

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

  • MySQL

    7264questions

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

  • Python 2.7

    1487questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。