モデルの定義
クラスをテーブルにマッピングします
「モデルの定義」は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フィードバックを取得できます。ローカル設定は不要です。