0Pricing
Python Academy · レッスン

モデルの定義

クラスをテーブルにマッピングします

「モデルの定義」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。

モデルとテーブルの対応

SQLAlchemy ORMでは、モデルはデータベースのテーブルに対応するPythonクラスです。各インスタンスが1行になります。

モデルは共有のBaseクラスを継承します。

from sqlalchemy.orm import DeclarativeBase
class Base(DeclarativeBase):
    pass
print('Base class ready')

__tablename__

すべてのモデルは、__tablename__にテーブル名を設定します。SQLAlchemyはSQLを生成するときにこの値を使用します。

from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
    pass
class User(Base):
    __tablename__ = 'users'
    id: Mapped[int] = mapped_column(primary_key=True)
print(User.__tablename__)

Mappedによるカラム

最新のSQLAlchemyでは、型ヒントを使ってカラムを宣言します。Mapped[int]とmapped_column()を使用します。型ヒントによってPythonの型が設定され、カラムの型も指定されます。

from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
    pass
class User(Base):
    __tablename__ = 'users'
    id: Mapped[int] = mapped_column(primary_key=True)
    name: Mapped[str]
    age: Mapped[int]
print('User has id, name, age')

主キー

primary_key=Trueを指定して、カラムを主キーとして設定します。整数の主キーはデフォルトで自動的にインクリメントされます。

from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
    pass
class Product(Base):
    __tablename__ = 'products'
    id: Mapped[int] = mapped_column(primary_key=True)
    title: Mapped[str]
print('id is the primary key')

オプションのカラム

NULL値を許可するには、Mapped[str | None]またはOptional[str]を使用します。通常のMapped[str]はNOT NULLです。

from typing import Optional
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
    pass
class User(Base):
    __tablename__ = 'users'
    id: Mapped[int] = mapped_column(primary_key=True)
    nickname: Mapped[Optional[str]]
print('nickname can be NULL')

デフォルト値と一意性

mapped_column()には、unique=Trueやdefault=のようなオプションを指定して、制約やデフォルト値を追加できます。

from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
    pass
class User(Base):
    __tablename__ = 'users'
    id: Mapped[int] = mapped_column(primary_key=True)
    email: Mapped[str] = mapped_column(unique=True)
    active: Mapped[bool] = mapped_column(default=True)
print('email is unique, active defaults to True')

文字列の長さ

長さの指定が必要なデータベースでは、mapped_column(String(50))のように文字列の長さを設定します。

from sqlalchemy import String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
    pass
class User(Base):
    __tablename__ = 'users'
    id: Mapped[int] = mapped_column(primary_key=True)
    name: Mapped[str] = mapped_column(String(50))
print('name limited to 50 chars')

スキーマの作成

Base.metadata.create_all(engine)は、Baseを継承するすべてのモデルのテーブルを作成します。

from sqlalchemy import create_engine
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
    pass
class User(Base):
    __tablename__ = 'users'
    id: Mapped[int] = mapped_column(primary_key=True)
    name: Mapped[str]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
print('Schema created')

インスタンスの作成

通常のPythonオブジェクトと同じようにモデルをインスタンス化し、カラムの値をキーワード引数で渡すと、行を作成できます。

from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
    pass
class User(Base):
    __tablename__ = 'users'
    id: Mapped[int] = mapped_column(primary_key=True)
    name: Mapped[str]
u = User(name='Alice')
print(u.name)

__repr__の追加

カスタム__repr__を定義すると、オブジェクトのデータが明確に表示されるため、デバッグしやすくなります。

from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
    pass
class User(Base):
    __tablename__ = 'users'
    id: Mapped[int] = mapped_column(primary_key=True)
    name: Mapped[str]
    def __repr__(self):
        return 'User(name=' + self.name + ')'
print(repr(User(name='Bob')))

モデルは通常のPythonのまま

モデルも通常のクラスです。データを操作するメソッドやプロパティを追加し、振る舞いと永続化を組み合わせることができます。

from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
    pass
class User(Base):
    __tablename__ = 'users'
    id: Mapped[int] = mapped_column(primary_key=True)
    name: Mapped[str]
    def greet(self):
        return 'Hi, ' + self.name
print(User(name='Carol').greet())

確認テスト

モデル定義のスキルを確認しましょう。

まとめ

ORMモデルの定義方法を学びました。

  • モデルはDeclarativeBaseを継承し、__tablename__を設定します
  • カラムにはMapped[type]とmapped_column()を使用します
  • primary_key、unique、defaultで制約を追加します
  • create_all()でテーブルを作成します

よくある質問

「モデルの定義」レッスンは無料ですか?

はい。「モデルの定義」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。

「モデルの定義」で何を学びますか?

クラスをテーブルにマッピングします ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Python Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「モデルの定義」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPython Academyレッスンでコードを書いて実行できますか?

はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. SQLAlchemy CoreとORMの違い
  2. モデルの定義
  3. Sessionによるクエリ
  4. リレーションシップとJOIN
← Python Academyに戻る