Rainbow Engine

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

Python

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

投稿日:2020年2月29日 更新日:

(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ライブラリのインストール手順を例に淳を追って記載しています。
https://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審査用広告コード


-Python

執筆者:


comment

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

関連記事

Pythonで画面作成をtkinterで行う方法(入門編)

<目次> (1) Pythonで画面作成をtkinterで行う方法(入門編)  (1-1) tkinterとは?  (1-2) STEP1:tkinterモジュールのインポート  (1-3) STEP …

Pythonのdatapackage学習中に遭遇したエラー「StopIteration」と「AttributeError」の対応

(0)目次&概説 (1) 記事の目的 (2) エラー1:AttributeError: ‘generator’ object has no attribute ‘n …

Azure FunctionsでPythonのライブラリを追加する方法(依存関係解決)

  <目次> (1) Azure FunctionsでPythonのライブラリを追加する方法(依存関係解決)  (1-1) requirement.txtの設定手順  (1-2) 補足事項 …

Pythonでargparseを用いて引数を受け取って実行する方法

<目次> (1) Pythonでargparseを用いて引数を受け取って実行する方法  (1-1) argparseとは?  (1-2) 基本的な使い方  (1-3) サンプルプログラム (2) 参考 …

PythonのFlaskフレームワークを用いたRest APIのサンプル

  <目次> (1) PythonのFlaskフレームワークを用いたRest APIのサンプル  (1-1) Flaskとは  (1-2) STEP1:Flaskフレームワークの導入  (1 …

  • English (United States)
  • 日本語
Top