【Python】Python ORM ~ SQLAlchemy / 入門編 ~

◾️はじめに

Python の ORM(Object-Relational Mapping)の
SQLAlchemyについて、扱う

目次

【0】Python ORM
【1】SQLAlchemy
【2】インストール
【3】サンプル
 例1:SQLite
 例2:PostgreSQL

【0】Python ORM

ORMライブラリ 特徴
SQLAlchemy 最も有名・柔軟性が高い・本格的なORM
SQLModel FastAPIの作者。SQLAlchemy + Pydantic の良いとこ取りをした設計。SQLAlchemyに統合される?
Prisma ORM TypeScript/Node.js で人気の ORM。Python 版もあり、FastAPI との親和性が高いモダンな ORM
Django ORM Djangoフレームワーク専用
Tortoise ORM asyncio対応・軽量
Peewee 軽量・学習コストが低い

【1】SQLAlchemy

* Pythonで一番メジャーなORM

cf. Alchemy (アルケミー) = 錬金術

https://www.sqlalchemy.org

【2】インストール

pip install sqlalchemy

# For PostgreSQL
pip install psycopg2-binary

【3】サンプル

* 「例1:SQLite」と「例2:PostgreSQL」との大きな違いは、
 Connection情報だけなので、これだけでもORMを使うメリットがある
 (DBに依存しない実装が可能という意味で)

例1:SQLite

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import DeclarativeBase


# Define table
class Base(DeclarativeBase):
    pass

class User(Base):
    __tablename__ = "users"

    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)

# Connect DB for SQLite
engine = create_engine("sqlite:///example.db", echo=True)

# Create table
Base.metadata.create_all(engine)

# Generate Session
Session = sessionmaker(bind=engine)
session = Session()

# Insert data
new_user = User(name="Mike", age=30)
session.add(new_user)
session.commit()

# Select
users = session.query(User).all()
for user in users:
    print(user.name, user.age)

session.close()

出力結果

2025-10-06 03:49:16,891 INFO sqlalchemy.engine.Engine BEGIN (implicit)
2025-10-06 03:49:16,891 INFO sqlalchemy.engine.Engine PRAGMA main.table_info("users")
2025-10-06 03:49:16,892 INFO sqlalchemy.engine.Engine [raw sql] ()
2025-10-06 03:49:16,892 INFO sqlalchemy.engine.Engine PRAGMA temp.table_info("users")
2025-10-06 03:49:16,892 INFO sqlalchemy.engine.Engine [raw sql] ()
2025-10-06 03:49:16,892 INFO sqlalchemy.engine.Engine 
CREATE TABLE users (
        id INTEGER NOT NULL, 
        name VARCHAR, 
        age INTEGER, 
        PRIMARY KEY (id)
)


2025-10-06 03:49:16,892 INFO sqlalchemy.engine.Engine [no key 0.00003s] ()
2025-10-06 03:49:16,893 INFO sqlalchemy.engine.Engine COMMIT
2025-10-06 03:49:16,894 INFO sqlalchemy.engine.Engine BEGIN (implicit)
2025-10-06 03:49:16,894 INFO sqlalchemy.engine.Engine INSERT INTO users (name, age) VALUES (?, ?)
2025-10-06 03:49:16,894 INFO sqlalchemy.engine.Engine [generated in 0.00006s] ('Mike', 30)
2025-10-06 03:49:16,895 INFO sqlalchemy.engine.Engine COMMIT
2025-10-06 03:49:16,896 INFO sqlalchemy.engine.Engine BEGIN (implicit)
2025-10-06 03:49:16,896 INFO sqlalchemy.engine.Engine SELECT users.id AS users_id, users.name AS users_name, users.age AS users_age 
FROM users
2025-10-06 03:49:16,896 INFO sqlalchemy.engine.Engine [generated in 0.00006s] ()
Mike 30

例2:PostgreSQL

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker, DeclarativeBase


# Define table
class Base(DeclarativeBase):
    pass

class User(Base):
    __tablename__ = "users"

    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)

DATABASE_URL = "postgresql://user:password@localhost:5432/demo_db"
engine = create_engine(DATABASE_URL, echo=True)
print("DATABASE_URL:", DATABASE_URL)
# Create table
Base.metadata.create_all(engine)

# Generate Session
Session = sessionmaker(bind=engine)
session = Session()

# Insert data
new_user = User(name="Mike", age=30)
session.add(new_user)
session.commit()

# Select
users = session.query(User).all()
for user in users:
    print(user.name, user.age)

session.close()

関連記事

Python ORM ~ SQLAlchemy / 基本編 ~
https://dk521123.hatenablog.com/entry/2025/10/10/013250
Python ORM ~ SQLAlchemy / あれこれ編 ~
https://dk521123.hatenablog.com/entry/2025/10/12/223857
FastAPI ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2025/10/05/014051
FastAPI ~ ファイルアップロード ~
https://dk521123.hatenablog.com/entry/2025/10/06/000101
Flask ~ SQLAlchemy / 入門編 ~
https://dk521123.hatenablog.com/entry/2018/09/19/223200
Flask ~ SQLAlchemy / 基本編 ~
https://dk521123.hatenablog.com/entry/2018/09/23/165130
streamlit ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2024/12/11/212315
Python ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2014/08/07/231242
Python ~ 基本編 / 文字列 ~
https://dk521123.hatenablog.com/entry/2019/10/12/075251
Python ~ PyFPDF ~
https://dk521123.hatenablog.com/entry/2023/07/19/001703
Python 〜 PDF to TEXT 〜
https://dk521123.hatenablog.com/entry/2025/10/04/214922
Python ~ 画像処理 / Pillow ~
https://dk521123.hatenablog.com/entry/2023/07/10/000000
Python 〜 Tesseract OCR
https://dk521123.hatenablog.com/entry/2025/10/03/141326