utamaro’s blog

誰かの役に立つ情報を発信するブログ

mysqlclientでdict型のデータを取得する方法

通常、selectをしたときはtupple型で取得されます。

少し使いづらいので、dict型で取得できるようにします。

connectを取得して、cursorにDictCursorを設定するだけです。

from MySQLdb.cursors import DictCursor

self.connect = _mysql.connect(
    host=DATABASES['HOST'],
    user=DATABASES['USER'],
    password=DATABASES['PASSWORD'],
    database=DATABASES['NAME'],
    port=DATABASES['PORT'],
)
# ↓ を設定すると、self.cursor.fetchone等を使ったときにdict型で取得できます。
self.cursor = self.connect.cursor(DictCursor)

mysqlclientの簡易utilの紹介

pythonを使ってmysqlに対してselectを実行したり、insert、update、deleteをしたいときがあります。

そんなときに使える簡易的なutilを紹介します。

必要なライブラリは↓です。

mysqlclient
jinjasql

↓の簡易utilはjinjasqlを使用しています。

import MySQLdb as _mysql
from MySQLdb.cursors import DictCursor
from jinjasql import JinjaSql

DATABASES = {
    'NAME': 'Sample',
    'USER': 'root',
    'PASSWORD': 'admin',
    'HOST': '127.0.0.1',
    'PORT': 3306,
}


class MySqlUtil(object):

    source = ''
    data = None

    def __init__(self):
        pass

    def open(self):
        self.connect = _mysql.connect(
            host=DATABASES['HOST'],
            user=DATABASES['USER'],
            password=DATABASES['PASSWORD'],
            database=DATABASES['NAME'],
            port=DATABASES['PORT'],
        )
        # ↓ を設定すると、self.cursor.fetchone等を使ったときにdict型で取得できます。
        self.cursor = self.connect.cursor(DictCursor)

    def execute(self):
        if self.data is None:
            params = {}
            query = self.source
        else:
            query, params = self.create_query(self.source, self.data)
        self.open()
        self.cursor.execute(query, params)

    def select_all(self):
        datas = self.cursor.fetchall()
        return datas

    def select_one(self):
        data = self.cursor.fetchone()
        return data

    def close_cursor(self):
        self.cursor.close()

    def close_connect(self):
        self.connect.close()

    def close(self):
        self.close_cursor()
        self.close_connect()

    def create_query(self, source, datas):
        jsql = JinjaSql()
        query, params = jsql.prepare_query(source, datas)
        return query, params

    def rollback(self):
        self.connect.rollback()

    def commit(self):
        self.connect.commit()

使い方

MySqlUtilを継承したModelクラスを用意します。

あとは、インスタンスを生成して、データをセットし、関数を実行するだけです。

class SampleModel(MySqlUtil):
    id = None

    def select_id(self):
        self.source = """
        select 1
        where id = {{id}}
        """
        self.data = {
            'id': self.id,
        }
        self.execute()
        return self.select_one()

if __name__ == "__main__":
    sample = SampleModel()
    sample.id = 1
    sample.select_id()