🦁

SQLAlchemyの基本的な使い方について

2023/03/25に公開

SQLAlchemyはPythonで使われるORM(Object Relational Mapper)であり、データベース操作をより簡単に行えるようにするライブラリ。

SQLAlchemyのインストール

簡単なディレクトリを作成し、venv(仮想環境)を使用してSQLAlchemyをインストールしていく。

# 簡単なディレクトリを作成する
$ mkdir ~/sqlalchemy-test

# ディレクトリを移動する
$ cd ~/sqlachemy-test

# venvを作成する
$ python3 -m venv venv

# 仮想環境へ入る。仮想環境へ入れたら左側に(venv)が表示されるようになる。
$ source venv/bin/activate
(venv)...$:

$ pip install sqlalchemy

# 以下コマンドでライブラリがインストールされたか確認する(SQLAlchemyの他に依存モジュールが入ってくる)
$ pip freeze
greenlet==2.0.2
importlib-metadata==6.0.0
SQLAlchemy==2.0.4  <-- 入ってる
typing-extensions==4.5.0
zipp==3.15.0

データベースエンジンの作成

SQLAlchemyを使用する際、データベースエンジンが必要となってくる。

データベースエンジンは、データベースに接続するためのパラメータを指定することで作成することができる。以下、SQLiteを用いたサンプル実装箇所。

from sqlalchemy import create_engine

engine = create_engine('sqlite:///example.db')

テーブルの定義

次に、データベースに格納するデータのテーブルを定義をしている。

テーブルは、データベースエンジンのMetaDataオブジェクトに追加されます。以下は、例としてusersテーブルを定義している。

from sqlalchemy import Table, Column, Integer, String, MetaData

metadata = MetaData()

users = Table('users', metadata,
    Column('id', Integer, primary_key=True),
    Column('name', String),
    Column('age', Integer),
    Column('email', String)
)

テーブルの作成

テーブルを作成するには、データベースエンジンのMetaDataオブジェクトを使用して、create_all()メソッドを呼び出す。このメソッドは、定義されたすべてのテーブルをデータベースに作成する。

metadata.create_all(engine)

データの挿入

データを挿入するには、テーブルに対応するTableオブジェクトを使用して、insert()メソッドを呼び出す。

以下は、usersテーブルにデータを挿入するコード例。

insert_stmt = users.insert().values(name='Alice', age=25, email='alice@example.com')
conn = engine.connect()
conn.execute(insert_stmt)

データの取得

データを取得するには、select()メソッドを使用します。

以下は、usersテーブルから全てのデータを取得している。

select_stmt = users.select()
result = conn.execute(select_stmt)
for row in result:
    print(row)

ソースの全体像

上記で説明してきたコードをsqlalchemy_test.pyとして作成。

//twitter.com/ryo__engineer7)

from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData

engine = create_engine('sqlite:///example.db')

metadata = MetaData()

users = Table('users', metadata,
              Column('id', Integer, primary_key=True),
              Column('name', String),
              Column('age', Integer),
              Column('email', String)
              )

metadata.create_all(engine)

insert_stmt = users.insert().values(
    name='Alice', age=25, email='alice@example.com')
conn = engine.connect()
conn.execute(insert_stmt)

select_stmt = users.select()
result = conn.execute(select_stmt)
for row in result:
    print(row)

実行

以下コマンドで実際にファイルを実行してみる。

(venv)...$ python sqlalchemy_test.py 
(1, 'Alice', 25, 'alice@example.com')

↑事前にinsertしていたデータが全て返ってくることが確認できる。

Discussion