share facebook facebook twitter menu hatena pocket slack

2018.02.26 MON

MySQL のクエリ結果を JSON で取得したい Python 編

川原 洋平

WRITTEN BY 川原 洋平

tl;dr

SELECT * FROM table WHERE id = N の結果を JSON で取得したい. ただ, それだけ.

こんなテーブルがあったとする

mysql> SELECT * FROM users;
+------+------+--------+
| id   | old  | name   |
+------+------+--------+
|    1 |   18 | Satou  |
|    2 |   20 | Yamada |
+------+------+--------+
2 rows in set (0.00 sec)

この結果を JSON で欲しい.

実装例

環境

$ python --version
Python 3.6.4
$ pip freeze
mysqlclient==1.3.12
pep8==1.7.1

mysqlclient は Python3.4 以降では動かない MySQLdb1 を fork したもの.

1 件取得する

SELECT * FROM users LIMIT 1;

SQL を実行すると…

mysql> SELECT * FROM users LIMIT 1;
+------+------+-------+
| id   | old  | name  |
+------+------+-------+
|    1 |   18 | Satou |
+------+------+-------+
1 row in set (0.00 sec)

以下のように書いた.

import MySQLdb
import json

conn = MySQLdb.connect(user='root',
                       password='your_password',
                       host='127.0.0.1',
                       db='sample')
query = 'SELECT * FROM users;'
cursor = conn.cursor(MySQLdb.cursors.DictCursor)
cursor.execute(query)
data = cursor.fetchone()
conn.close()
print(json.dumps(data, indent=4))

実行.

$ python sample2.py 
{
    "id": 1,
    "old": 18,
    "name": "Satou"
}

肝となるのは Cursor クラスの MySQLdb.cursors.DictCursor で, これを用することでクエリの結果を辞書形式で取得することが出来る. 詳細についてはドキュメントの Using and extending に書かれている.

全件を取得する

SELECT * FROM users

SQL を実行すると, 以下のような結果となる.

mysql> SELECT * FROM users;
+------+------+--------+
| id   | old  | name   |
+------+------+--------+
|    1 |   18 | Satou  |
|    2 |   20 | Yamada |
+------+------+--------+
2 rows in set (0.00 sec)

以下のように書いた.

import MySQLdb
import json

conn = MySQLdb.connect(user='root',
                       password='your_password',
                       host='127.0.0.1',
                       db='sample')
query = "SELECT * FROM users;"
with conn.cursor(MySQLdb.cursors.DictCursor) as cursor:
    cursor.execute(query)
    data = cursor.fetchall()
print(json.dumps(data, indent=4))

以下のように出力される. with ~ as ステートメントを使うことで conn.close() が不要になる.

$ python sample.py 
[
    {
        "id": 1,
        "old": 18,
        "name": "Satou"
    },
    {
        "id": 2,
        "old": 20,
        "name": "Yamada"
    }
]

指定した条件のレコードを取得

SELECT * FROM users WHERE id = 2;

SQL を実行すると, 以下のような結果となる.

mysql> SELECT * FROM users WHERE id = 2;
+------+------+--------+
| id   | old  | name   |
+------+------+--------+
|    2 |   20 | Yamada |
+------+------+--------+
1 row in set (0.00 sec)

以下のように書いた.

import MySQLdb
import json

conn = MySQLdb.connect(user='root',
                       password='your_password',
                       host='127.0.0.1',
                       db='sample')
query = "SELECT * FROM users;"
with conn.cursor(MySQLdb.cursors.DictCursor) as cursor:
    cursor.execute(query)
    all_data = cursor.fetchall()

for data in all_data:
    if data['id'] == 2:
        print(json.dumps(data, indent=4))

以下のように出力される.

$ python sample.py 
{
    "id": 2,
    "old": 20,
    "name": "Yamada"
}

辞書形式になってしまえばこっちの物だってことで…

以上

思ったよりも簡単にクエリの結果を JSON で得ることが出来た.

元記事はこちら

MySQL のクエリ結果を JSON で取得したい Python 編

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。