【Python】SQLAlchemy データを取得する方法

Python

はじめに

にゃーすけ
にゃーすけ

データベースからデータを取得したいけどSQLを知らないから勉強しないといけないにゃあ。

しげっち
しげっち

そんな時はSQLAlchemyを使ってみよう。
SQLを知らなくてもPythonのオブジェクト構造を用いてデータベースとやり取りできるようになるよ。

SQLAlchemyとは

SQLAlchemyはORMモジュールの一つです。
ORMとはObject-Relational Mappingの略で、データベースとPythonのオブジェクトを中継して相互変換する機能です。
ORMモジュールの中でも、有名で良く使用されているのがSQLAlchemyです。

ORMを使用することでPythonのソース上に直接SQLを記載しなくても(極端にいえばSQL言語を知らなくても)Pythonのオブジェクト操作でデータベースとやり取りすることができるようになり、ソースの可読性もあがります。

VisualStudioCode等、Pythonの文法エラーを検知してくれるエディタを使用している場合でも、SQL文のエラーは検知してくれません。プログラムを実行して初めて文法エラーに気づくことになります。
ORMを使用すると、SQL文を直接記載することが無くなるので、こういった非効率な点を改善することができます。


SQLAlchemyのデータ作成・更新方法は下記で解説しています。

SQLAlchemyのインストール

しげっち
しげっち

SQLAlchemyはPythonの標準ライブラリには含まれていないため、インストールする必要があるよ。

早速インストールしてみましょう。

pip install sqlalchemy

SQLAlchemyを使用してみよう

インポートの記載

SQLAlchemyを使用できるようにするため、インポート文を記載します。

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
にゃーすけ
にゃーすけ

たくさんインポートするものがあるにゃあ。

しげっち
しげっち

全部必要になってくるけど、深く考える必要はないよ。
SQLAlchemyを使用する時は必ず書くおまじないと思って漏れなく記載しよう。

エンジンオブジェクトの作成

データベース操作を行うために、まずはデータベースに接続する必要があります。
SQLAlchemyからデータベースに接続するためにエンジンオブジェクトのインスタンスを生成します。

# エンジンオブジェクトの作成
eng = create_engine('sqlite:///Test.db')
しげっち
しげっち

エンジンオブジェクトを生成したこのタイミングでは、データベースにはまだ接続しないよ。

なお、ここではSQLiteへの接続方法を記載します。
予めSQLiteのデータベースファイルは準備しておきます。

SQLiteのデータベース作成はDB Browserを使用すると比較的簡単に作成できます。
作成方法についてはこちらで解説しています。

ベースクラスの準備

declarative_baseはPythonのクラスとデータベースをマッピングするためのベースとなるクラスです。
このベースクラスを派生させて、データベースの各種テーブルに対応するクラスを作成することになります。

# ベースクラスの作成
base = declarative_base()

モデルクラスの作成

作成したベースクラスからデータベースのテーブルに対応したモデルクラスを作成してみましょう。

# モデルクラスの作成
class Test_data(base):
    __tablename__ = 'test_data'

    id = Column(Integer, primary_key=True)
    name = Column(String(255))
    price = Column(Integer)

__tablename__にデータベースのテーブル名を記載します。
続いて、列(フィールド)を記載します。
サンプルではtest_dataというテーブルにidnamepriceという3つの列を準備しました。

Sessionの作成

データベースのテーブルからデータをを取得するためにSessionを作成します。

# Sessionの作成
mak = sessionmaker(bind=eng)
ses = mak()

sessionmakerの引数bindにエンジンオブジェクトを渡します。
この戻り値としてsessionmakerオブジェクトを返します。
サンプルではmakという名前にしました。
このmakからmak()として記載するとその戻り値がSessionオブジェクトを返します。
このSessionオブジェクトを使用してデータベースからデータを取得します。

なお、typeで確認すると下記のような形式のオブジェクトとなっています。

print(type(mak))
print(type(ses))

# 実行結果
# <class 'sqlalchemy.orm.session.sessionmaker'>
# <class 'sqlalchemy.orm.session.Session'>

データの取得

データの取得は下記のように行います。
1行ずつ取得する方法と、一旦リストに格納して取得する方法となります。

# for文で1レコードずつ取得
for r in ses.query(Test_data).order_by(Test_data.id):
    print(r.id, r.name, r.price)

#対象レコードをすべてリストで取得
list_a = ses.query(Test_data).order_by(Test_data.id).all()
for r in list_a:
    print(r.id, r.name, r.price)

違いはallの部分です。allをつけるとリストで取得できます。
こちらもtypeで確認してみましょう。

print(type(ses.query(Test_data).order_by(Test_data.id)))
print(type(ses.query(Test_data).order_by(Test_data.id).all()))

# <class 'sqlalchemy.orm.query.Query'>
# <class 'list'>


まとめ

SQLAlchemyを使用したデータ取得方法について、解説しました。

  • SQLAlchemyは一番使用されているORM(Object-Relational Mapping)モジュールである。
  • Python標準モジュールではないためインストールが必要。pip install sqlalchemy
  • データベース接続するためにエンジンオブジェクトを作成する。create_engine
  • declarative_baseでベースクラスを作成。
  • 作成したベースクラスから各テーブルと紐付けるモデルクラスを作成する。
  • Sessionオブジェクトを作成し、モデルクラスを引数に渡してデータを取得する。
しげっち
しげっち

最後まで見ていただき、ありがとうございます。

一連のソースコードを下記に記載しておきます。

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

# エンジンオブジェクトの作成
eng = create_engine('sqlite:///Test.db')

# ベースクラスの作成
base = declarative_base()

# モデルクラスの作成
class Test_data(base):
    __tablename__ = 'test_data'

    id = Column(Integer, primary_key=True)
    name = Column(String(255))
    price = Column(Integer)

# Sessionの作成
mak = sessionmaker(bind=eng)
ses = mak()

# for文で1レコードずつ取得
for r in ses.query(Test_data).order_by(Test_data.id):
    print(r.id, r.name, r.price)

#対象レコードをすべてリストで取得
list_a = ses.query(Test_data).order_by(Test_data.id).all()
for r in list_a:
    print(r.id, r.name, r.price)

# 終了
ses.close()
タイトルとURLをコピーしました