SQLAlchemyのメモ書き【Python】

目次

結論。自分の理解まとめ。

SQLAlchemyはORMツール。このライブラリ使って、DB操作しろよってこと。

ORMは、リレーショナルデータベースに対する操作をオブジェクト型指向言語で扱えるようにするための手法です。
つまり、SQLを書かずにDBデータの操作を行う手法

具体的なデータ操作の処理は、カプセル化されています。
なので、SQLを記載せずに全部Pythonで記載できるし、DBがSQLiteだろうがMySQLだろうが何であれ、このSQLAlchemyを通すことで、DBの違いを意識しなくても良くなります。

また、テーブルの表現の仕方としては、オブジェクト指向でやるので、
テーブルのカラムをクラスで表現して、テーブルの行をそのクラスのインスタンスで表現することになります。

SQL Alchemyの全体像の認識

2層の概念があり、「SQL Alchemy ORM」と「SQL Alchemy Core」です。

ORMの方は、より抽象的で便利なAPIを用意しています。あまりSQLを意識せず、機能を実行するイメージか?
テーブル行をPythonのインスタンスで表現して、DBに関連付けていく作り方。

Coreの方は、基本的にユーザーはCore層の一部である「SQL Expression Language」というものを使うようです。ORMでは表現しきれない、より具体的でSQLに近い表現で書いていくようです。

また、SQL AlchemyからDBへアクセスするために、DBのAPIは別途インストールが必要だそうです。使用するDBに応じて対応してください。SQLiteの場合は、標準モジュールであるsqlite3と同一のDBAPIだそうなので、追加のインストールは不要です。つまり、SQL Alchemyだけインストールすれば良い

SQL Alchemy ORMの使い方

DBへの接続用インスタンス生成

PYTHONCOPY
from sqlalchemy import create_engine
# create_engine('DBの種類(+ドライバーの指定があれば)://DB接続ユーザー名:DB接続パスワード@ホスト名:ポート番号/接続DB名?charset=文字コード')
engine = create_engine('sqlite:///test.db')

テーブルとクラスのマッピング

PYTHONCOPY
from sqlalchemy.orm import declarative_base

Base = declarative_base()

from sqlalchemy.schema import Column
from sqlalchemy.types import Integer, String

class Mysite(Base):
__tablename__ = 'Mysite'
id = Column(Integer, primary_key=True)
name = Column(String)
twitter = Column(String)
address= Column(String)

テーブルをDBに作成する

PYTHONCOPY
Base.metadata.create_all(engine)

Baseを継承しているクラスの定義がDBに作成される。

metadataはDBの色々な情報を持っているオブジェクト。これを使うことで既存のDBの定義を取得することもできる。

セッション

セッションを通してDBにアクセスする。セッションはDBコネクションを作成してから切断するまでの単位。セッションを作成して、DBと繋がって、クエリを実行することでデータ操作できる。

PYTHONCOPY
from sqlalchemy.orm import sessionmaker
SessionObj = sessionmaker(bind=engine)
session = SessionObj()

# ~~何かのDBアクセス処理~~

# ちゃんとクローズする。
session.close()

データを追加してみる

PYTHONCOPY
site_info= Mysite(name="taishi", twitter="@taishi_tera", address="https://surukoto.jp")
session.add(site_info)
session.commit()

既存のテーブルを使う場合は、マッピング方法を簡単にできる

PYTHONCOPY
Base = declarative_base(bind=engine) 
class sudeniaru_table(Base):
__tablename__ = "Mysite"
__table_args__ = {"autoload": True}

データを取得してみる

PYTHONCOPY
for row in session.query(sudeniaru_table):
print(row.id, row.name, row.twitter, row.address)
Weekly Most Popular
記事書いたりサイト運営してる人
シイタ / siita
シイタ / siita
現役サラリーマン/システムエンジニアです。 会社外でも、自分に自信を持って活躍できるようになりたい。金銭的にも安心できるようになりたい。という気持ちから技術向上や不労所得を得るために、日々活動することを記録し、共有していきます。