Python
SQLite3
データベース
初心者

Pythonによるスクレイピング&機械学習のお勉強その3-2 - データベースについて

今回の目標

このシリーズでは教科書(文献1)に沿ってPythonによるスクレイピングと機械学習を学びます。今回は第3章「データソースと書式・整形」から3-2「データベースについて」を学びます。

原則、教科書のサンプルプログラムを作成してゆきますが、著作権に配慮し、できるだけそのままではなく類題を作成して勉強してゆく方針です。

方法と結果

  • 準備

その0で作成した学習用docker環境でpythonの実行を行います。

$ docker run -t -i -v $HOME/src:$HOME/src pylearn2 /bin/bash

類題3-2 SQLiteで仮想通貨リストをデータベース化する

教科書ではPython標準で搭載されているSQLite3とMySQL、非SQL系のTinyDBの基本的な使い方のサンプルが掲載されています。
今回は類題として前記事でも使った仮想通貨リストのJSONデータからSQLite3でSQLデータベースを作成して検索してみるというタスクを行います。

sqlite-test-cclef.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pylearn as pl
import json
import os.path
import sqlite3

# API
API = 'https://www.cryptopia.co.nz/api/GetCurrencies'

# JSONファイル名
JSONFILE = 'currencies.json'

# JSONファイルがすでに存在するかチェックする
jsonexists = os.path.exists(JSONFILE)

# 存在しなければダウンロードする
if not jsonexists:
    js = pl.download(API)
    with open(JSONFILE, 'w') as jf:
        jf.write(js)
        print(JSONFILE, 'を作成しました。')
else:
    print('JSONファイルはすでに存在しているためダウンロードしません。')

# JSONデータを読み込む
data = None
with open(JSONFILE, 'r') as jf:
    data = json.load(jf)

headers = ['Id', 'Name', 'Symbol', 'Algorithm', 'WithdrawFee', 'MinWithdraw', 'MaxWithdraw',
           'MinBaseTrade', 'IsTipEnabled', 'MinTip', 'DepositConfirmations', 'Status', 
           'StatusMessage', 'ListingStatus']

currencydict = data['Data']
currencies = []
for c in currencydict:
    currencies.append(list(c.values()))

# データベースに接続
dbfile = 'currencies.sqlite'
connection = sqlite3.connect(dbfile)

# テーブルを作成
cursor = connection.cursor()
cursor.executescript("""

/* すでにcurrenciesテーブルがあれば削除する */
DROP TABLE IF EXISTS currencies;

/* テーブルを作成 */
CREATE TABLE currencies(
  Id INTEGER PRIMARY KEY,
  Name TEXT,
  Symbol TEXT,
  Algorithm TEXT,
  WithdrawFee DECIMAL,
  MinWithdraw DECIMAL,
  MaxWithdraw DECIMAL,
  MinBaseTrade DECIMAL,
  IsTipEnabled BOOL,
  MinTip DECIMAL,
  DepositConfirmations INTEGER,
  Status TEXT,
  StatusMessage TEXT,
  ListingStatus TEXT
);
""")
#いったんcommit
connection.commit()

# データを挿入する
cursor = connection.cursor()
cursor.executemany(
    'INSERT INTO currencies(Id, Name, Symbol, Algorithm, WithdrawFee, MinWithdraw, MaxWithdraw, MinBaseTrade, IsTipEnabled, MinTip, DepositConfirmations, Status, StatusMessage, ListingStatus) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)',
    currencies)
connection.commit()

# アルゴリズムがX11のものを抽出して表示
cursor = connection.cursor()
cursor.execute(
    'SELECT * FROM currencies WHERE Algorithm = "X11"')
x11_list = cursor.fetchall()
for c in x11_list:
    print(c)
  • 実行結果
$ python ./sqlite-test-cclef.py
JSONファイルはすでに存在しているためダウンロードしません。
(8, 'WeAreSatoshi', 'WSX', 'X11', 10, 20, 2000000000, 2e-05, 0, 0, 200, 'OK', None, 'Active')
(33, 'CryptoClub', 'CCB', 'X11', 50, 100, 10000000, 2e-05, 0, 0, 200, 'OK', None, 'Active')
(63, 'GroinCoin', 'GXG', 'X11', 100, 200, 2000000000, 2e-05, 0, 0, 200, 'OK', None, 'Active')
(82, 'SquallCoin', 'SQL', 'X11', 0.05, 0.1, 2000000000, 2e-05, 0, 0, 20, 'OK', None, 'Active')
(92, 'PiggyCoin', 'PIGGY', 'X11', 1, 2, 2000000000, 2e-05, 0, 2, 20, 'OK', '01/09/18 - No connections', 'Active')
#(後略)

ちゃんとデータベースが作成されており、検索することができました。

今回達成したこと

  • PythonからSQLデータベースに接続する方法(TinyDBも)の基本を学びました。

SQLの文法もそれほどまだ理解していないので、必要になったら勉強したいと思います。

参考文献

  1. クジラ飛行机, Pythonによるスクレイピング&機械学習[開発テクニック], ソシム株式会社, 2016