コンテンツにスキップ

SQLModel

SQLModel

SQLModelは、シンプルさ、互換性、堅牢性を重視して設計された、PythonでSQLデータベースを扱うためのライブラリです。

Test Publish Coverage Package version


ドキュメント: https://sqlmodel.dokyumento.jp

ソースコード: https://github.com/tiangolo/sqlmodel


SQLModelは、Pythonオブジェクトを使用して、PythonコードからSQLデータベースと対話するためのライブラリです。直感的で使いやすく、互換性が高く、堅牢であるように設計されています。

SQLModelは、Pythonの型アノテーションに基づいており、PydanticSQLAlchemyによって駆動されています。

主な機能は以下のとおりです。

  • 直感的な記述: 優れたエディタサポート。補完がどこでも利用できます。デバッグ時間を短縮します。使いやすく、習得しやすいように設計されています。ドキュメントを読む時間を短縮します。
  • 使いやすさ: 賢明なデフォルト値が設定されており、記述するコードを簡素化するために多くの作業をバックグラウンドで行います。
  • 互換性: FastAPI、Pydantic、SQLAlchemyとの互換性を考慮して設計されています。
  • 拡張性: SQLAlchemyとPydanticのすべての機能を基盤として利用できます。
  • 簡潔さ: コードの重複を最小限に抑えます。1つの型アノテーションで多くの作業を実行します。SQLAlchemyとPydanticでモデルを複製する必要はありません。

スポンサー

FastAPIにおけるSQLデータベース

SQLModelは、FastAPIアプリケーションでSQLデータベースとの対話を簡素化するために設計されており、同じ作者によって作成されました。 😁

SQLAlchemyとPydanticを組み合わせ、記述するコードを可能な限り簡素化し、コードの重複を最小限に抑えながら、可能な限り最高の開発エクスペリエンスを実現します。

SQLModelは、実際には、PydanticSQLAlchemyの上に構築された薄い層であり、両方と互換性を持つように慎重に設計されています。

要件

現在サポートされている最新のPythonバージョン

SQLModelは、PydanticSQLAlchemyに基づいているため、これらが必要です。SQLModelをインストールすると、自動的にインストールされます。

インストール

$ pip install sqlmodel
---> 100%
Successfully installed sqlmodel

データベース、SQL、その他のすべてについての入門については、SQLModelドキュメントを参照してください。

簡単な例を次に示します。 ✨

SQLテーブル

heroという名前のSQLテーブルがあり、以下の列があるとします。

  • id
  • name
  • secret_name
  • age

そして、以下のデータを持つようにしたいとします。

id name secret_name age
1 Deadpond Dive Wilson null
2 Spider-Boy Pedro Parqueador null
3 Rusty-Man Tommy Sharp 48

48

SQLModelモデルの作成

from typing import Optional

from sqlmodel import Field, SQLModel


class Hero(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    name: str
    secret_name: str
    age: Optional[int] = None

次に、次のようにSQLModelモデルを作成できます。

このHeroクラスは、SQLModelモデルであり、PythonコードにおけるSQLテーブルに相当します。

そして、これらの各クラス属性は、各テーブル列に相当します。

行の作成

hero_1 = Hero(name="Deadpond", secret_name="Dive Wilson")
hero_2 = Hero(name="Spider-Boy", secret_name="Pedro Parqueador")
hero_3 = Hero(name="Rusty-Man", secret_name="Tommy Sharp", age=48)

次に、テーブルの各をモデルのインスタンスとして作成できます。

このように、テーブルを表す、クラスインスタンスを使った従来のPythonコードを使用して、SQLデータベースと通信できます。

エディタサポート

すべては、最高のエディタサポートにより、可能な限り最高の開発エクスペリエンスを得られるように設計されています。

自動補完を含みます。

そして、インラインエラーも含まれます。

データベースへの書き込み

from typing import Optional

from sqlmodel import Field, Session, SQLModel, create_engine


class Hero(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    name: str
    secret_name: str
    age: Optional[int] = None


hero_1 = Hero(name="Deadpond", secret_name="Dive Wilson")
hero_2 = Hero(name="Spider-Boy", secret_name="Pedro Parqueador")
hero_3 = Hero(name="Rusty-Man", secret_name="Tommy Sharp", age=48)


engine = create_engine("sqlite:///database.db")


SQLModel.metadata.create_all(engine)

with Session(engine) as session:
    session.add(hero_1)
    session.add(hero_2)
    session.add(hero_3)
    session.commit()

チュートリアルを簡単に mengikuti することで、SQLModelについてさらに詳しく学ぶことができますが、今すぐすべてをまとめてデータベースに保存する方法を知りたい場合は、次のようにします。

これにより、3人のヒーローを持つSQLiteデータベースが保存されます。

データベースからの選択

from typing import Optional

from sqlmodel import Field, Session, SQLModel, create_engine, select


class Hero(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    name: str
    secret_name: str
    age: Optional[int] = None


engine = create_engine("sqlite:///database.db")

with Session(engine) as session:
    statement = select(Hero).where(Hero.name == "Spider-Boy")
    hero = session.exec(statement).first()
    print(hero)

次に、同じデータベースから選択するためのクエリを記述できます。たとえば、次のようにします。

あらゆる場所でのエディタサポート

SQLModelは、データベースからデータを選択した後でも、最高の開発エクスペリエンスとエディタサポートを提供するように注意深く設計されています。

SQLAlchemyとPydantic

このHeroクラスは、SQLModelモデルです。

しかし同時に、✨ これはSQLAlchemyモデルでもあります ✨。そのため、他のSQLAlchemyモデルと組み合わせて使用したり、SQLAlchemyを使用するアプリケーションをSQLModelに簡単に移行したりできます。

そして同時に、✨ これはPydanticモデルでもあります ✨。継承を使用してすべてのデータモデルを定義し、コードの重複を回避できます。これにより、FastAPIで非常に使いやすくなります。

ライセンス