Rainbow Planet (GT×IT×SP×SA)

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

01_IT技術 (Technology)

PythonのdatapackageとSQLAlchemy、SQLiteを使ってcsvデータをSELECTする

投稿日:

(0)目次&概説

(1) 今回の目的
 (1-1) 目的
 (1-2) 前提条件
(2) 実施手順
 (2-0) 事前作業
 (2-1) データ(csv)のロード
 (2-2) エンジンの作成
 (2-3) データファイルの作成・保存
 (2-4) SQLのSELECT句発行
 (2-5) サンプルプログラムと実行結果例
(3) サンプルプログラムの補足説明
 (3-1) from XXX import YYY
 (3-2) datapackageのPackageクラス
(4) 用語説明
 (4-1) Pythonのdatapackageとは?
 (4-2) SQLAlchemyとは?

(1) 目的と前提条件

(1-1) 目的

この記事ではPythonの「datapackage」と「SQLAlchemy」および「SQLite」を用いて、Web上で公開しているcsv形式のデータをSQLiteのデータファイルに保存し、それを照会する方法について紹介します。

目次にもどる

(1-2) 前提条件

1.Python3がインストールされていること
2.PyScripterがインストールされていること

目次にもどる

(2) 実施手順

データや手順などはこちらのサイトを参考に進めています。
https://datahub.io/core/s-and-p-500-companies

ここからの手順は新しくPythonのモジュールを作成して行います。

(図201)

(2-0) 事前作業

もし「datapackage」や「sqlalchemy」のパッケージがインストールされていない場合は事前にインストールを行います。資源はPyPIのサイトからダウンロードし、pipコマンドでインストールをします。下記はdatapackageのインストール例ですが、sqlalchemyも同様に行います。

(図202)
・資源ダウンロード


・pipコマンドでインストール


・インストール完了

パッケージのインストールの詳細な流れについて押さえたい場合は、下記の記事などもご参照ください。Pandasライブラリのインストール手順を例に淳を追って記載しています。
http://rainbow-engine.com/install-pandas-python/

目次にもどる

(2-1) データ(csv)のロード

datapackageパッケージのPackageクラスをインポートして、Packageのインスタンスを作成します。Packageの引数にはロードするcsvを公開しているURLを指定します。

from datapackage import Package
package = Package('https://datahub.io/core/s-and-p-500-companies/datapackage.json')

目次にもどる

(2-2) エンジンの作成

SQLAlchemyにおいてDB接続する際の起点となるオブジェクトを「エンジン」と呼んでいます。「エンジン」オブジェクトを作るにはsqlalchemyパッケージのcreate_engineファンクションを使います。

前半の第一引数は「Dialect」と呼ばれ「oracle」や「mysql」といったデータベースの種類を指定します。今回の例では「sqlite」を指定しており、続く「:///」の記述の後の部分はデータファイル名を指定しています。

from sqlalchemy import create_engine
engine = create_engine('sqlite:///periodic-table-datapackage_company.db')

注意点として、create_engineを実行してもDBAPIへのコネクションが張られる訳ではなく、あくまで「create_engine.execute([SQL])」や「create_engine.connect()」等のカーソルメソッドを実行する事で初めてDBAPIとの接続が行われます。

目次にもどる

(2-3) データファイルの作成・保存

データファイルの作成保存はdatapackageパッケージのPackageクラスの「save」メソッドを利用します。デフォルトではモジュール(.py)と同じ階層に「.db」ファイルが作成されます。

datapackage.package.Package('https://datahub.io/core/s-and-p-500-companies/datapackage.json').save(storage='sql', engine=engine)

 

(図231)
Pythonモジュールと同じ階層に.dbファイルが保存された

目次にもどる

(2-4) SQLのSELECT句発行

今回はcreate_engineの中にあるexecuteメソッドを実行して、引数で指定したSQLの結果を取得します。取得した結果はlist()関数でlist形式に変換し、printでコンソール出力しています。

<参考>create_engineのexecuteメソッドについて

print(list(engine.execute('SELECT * from constituents_csv where Name like \'%Bank%\'')))

目次にもどる

(2-5) サンプルプログラムと実行結果例

■サンプルプログラム
上記(2-1)~(2-4)の内容を踏まえたサンプルプログラム。 

import datapackage
import sqlalchemy

def main():

    pkg = datapackage.package.Package('https://datahub.io/core/s-and-p-500-companies/datapackage.json')
    from sqlalchemy import create_engine
    engine = create_engine('sqlite:///periodic-table-datapackage_company3.db')
    datapackage.package.Package('https://datahub.io/core/s-and-p-500-companies/datapackage.json').save(storage='sql', engine=engine)
    print(list(engine.execute('SELECT * from constituents_csv where Name like \'%Bank%\'')))

if __name__ == '__main__':
    main()

 

■実行結果
(図251)
Python Interpreterのコンソールに「Bank」を社名に含む企業が表示されている。

目次にもどる

(3) サンプルプログラムの補足説明

上記の(2-5)で紹介したサンプルプログラムの内容について補足説明します。

(3-1) from XXX import YYY

「from XXX import YYY」は意味合い的には「import XXX.YYY」と同じですが、前者の書き方の場合をすれば使う際にいちいちXXX.YYYと書かずに省略して「YYY」で済むのでスマート。 具体的には次の2つは同じ意味になります。

・書き方1

import datapackage
from datapackage import Package
[変数] = Package([引数群])

 

・書き方2

import datapackage
[変数] = datapackage.package.Package([引数群])

目次にもどる

(3-2) datapackageのPackageクラス

Packageクラスは「datapackage」パッケージの中の「package」モジュールの中にあります。

datapackageパッケージ
 ∟packageモジュール
  ∟Packageクラス

Packageクラスをインスタンス化してロードしたデータを閲覧する場合は「resources」(=datapackage.package.Package.resources)などで内容を確認する事もできます(データ量が多いと大変ですが・・)。また「resource_names」(=datapackage.package.Package.resource_names)でロードしたファイルの一覧を取得できます。

目次にもどる

(4) 用語説明

(4-1) Pythonのdatapackageとは?

Data PackageはローカルやリモートにあるCSVやJSON形式のデータを扱う事ができるPythonパッケージです。例えば、年度別の複数ファイルに分かれたデータを読み込んでテーブルにINSERTしたりなど、データ加工のための機能が多数あります。

  >目次にもどる

(4-2) SQLAlchemyとは?

SQLALchemyはPythonのORM(Object Relational Mapper)です。
ORMとはリレーショナルデータベースとオブジェクト指向のオブジェクトとの間のデータ形式の際を吸収するための仲介役のライブラリです。ORMのライブラリを用いるとSQLを使わずに、SQLと同等の内容をオブジェクト指向言語で記載できます。

(例)

SELECT * FROM JOBS WHERE job_name = 'Engineer';
↓
var orm = require('generic-orm-libarry');
var job = orm("JOBS").where({ job_name: 'Engineer' });

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-01_IT技術 (Technology)

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

APサーバ(Java)⇒DBサーバ(OracleDB 11g)へJDBC接続する方法まとめ

(0)目次 (1) 前提条件 (2) JDBCドライバーのインストール  (2-1) JDBCドライバーをダウンロード  (2-2) APサーバにアップロード・解凍 (3) プログラムの実装  (3- …

JavaのJDBC接続でjava.sql.SQLRecoverableException: Closed Connectionが発生した時の解決メモ

(0)目次&概説 (1) エラー事象の概要  (1-1) エラーの発生状況  (1-2) エラーメッセージ全文 (2) エラーの原因 (3) エラーの対処方法  (3-1) エラーの修正内容  (3- …

Oracleデータベースのインデックスの有無による速度の差異を検証する

(0)目次&概説 (1) 検証概要 (2) 検証環境 (3) 検証準備  (3-1) サンプルデータ作成(インデックス無)  (3-2) サンプルデータ作成(インデックス有)  (3-3) 実行計画の …

ファイル転送や読み込みが遅いNW問題時に調査したことやパフォーマンスモニタの基本操作

(0)目次&概説 (1) ネットワークが遅い時  (1-1) 概要  (1-2) 想定シーン (2) ネットワークが遅い時の調査の切り口  (2-1) 転送速度のチェック  (2-2) LANケーブル …

PythonのSQLAlchemyで「Identifier ‘XXX’ exceeds maximum length of 30 characters」エラーや「DtypeWarning: Columns (X) have mixed types.」警告が出た時の対処について

(0)目次&概説 (1) エラー1:sqlalchemy.exc.ArgumentError  (1-1) 発生状況・エラーメッセージ   (1-1-1) エラーメッセージ   (1-1-2) エラー …

Top