SQLModel with Protocol Buffers & gRPC support
A fork of SQLModel adding seamless protobuf/gRPC integration
This is a fork of SQLModel that extends the original library with Protocol Buffers (protobuf) and gRPC integration. SQLModel is a library for interacting with SQL databases from Python code, with Python objects.
Original SQLModel: https://sqlmodel.tiangolo.com | GitHub
SQLModel is a library for interacting with SQL databases from Python code, with Python objects. It is designed to be intuitive, easy to use, highly compatible, and robust.
SQLModel is based on Python type annotations, and powered by Pydantic and SQLAlchemy.
The key features are:
- Intuitive to write: Great editor support. Completion everywhere. Less time debugging. Designed to be easy to use and learn. Less time reading docs.
- Easy to use: It has sensible defaults and does a lot of work underneath to simplify the code you write.
- Compatible: It is designed to be compatible with FastAPI, Pydantic, and SQLAlchemy.
- Extensible: You have all the power of SQLAlchemy and Pydantic underneath.
- Short: Minimize code duplication. A single type annotation does a lot of work. No need to duplicate models in SQLAlchemy and Pydantic.
- π Protocol Buffers Integration: SQLModel classes now implement the protobuf
Messageinterface, enabling direct serialization/deserialization and gRPC compatibility. - π Automatic Descriptor Generation: Protobuf descriptors are automatically synthesized from your SQLModel classes with intelligent type inference.
- π gRPC Ready: Use your SQLModel models directly in gRPC services without additional conversion code.
SQLModel is designed to simplify interacting with SQL databases in FastAPI applications, it was created by the same author. π
It combines SQLAlchemy and Pydantic and tries to simplify the code you write as much as possible, allowing you to reduce the code duplication to a minimum, but while getting the best developer experience possible.
SQLModel is, in fact, a thin layer on top of Pydantic and SQLAlchemy, carefully designed to be compatible with both.
This fork extends SQLModel with seamless Protocol Buffers (protobuf) and gRPC support:
-
Protobuf Message Interface: All SQLModel classes now inherit from
google.protobuf.message.Message, making them fully compatible with protobuf serialization and gRPC. -
Automatic Descriptor Generation: Protobuf descriptors are automatically synthesized from your SQLModel class definitions, with intelligent type inference from Python type annotations.
-
Full Protobuf API: All standard protobuf methods are implemented:
SerializeToString()/serialize_to_string()- Serialize to binaryParseFromString()/parse_from_string()- Deserialize from binaryMergeFrom()/merge_from()- Merge from another messageClear()/clear()- Reset to defaultsHasField()/has_field()- Check field presence- And more...
-
Type Inference: Automatically maps Python types to protobuf field types:
intβTYPE_INT64floatβTYPE_DOUBLEboolβTYPE_BOOLstrβTYPE_STRINGbytesβTYPE_BYTES- Lists/tuples β
LABEL_REPEATED
-
Custom Field Descriptors: Optionally provide custom protobuf field descriptors via
Field(grpc_descriptor=...)for fine-grained control.
from sqlmodel import Field, SQLModel
class Hero(SQLModel, table=True):
id: int | None = Field(default=None, primary_key=True)
name: str
age: int | None = None
# Create a hero instance
hero = Hero(name="Deadpond", age=30)
# Serialize to protobuf binary format
serialized = hero.SerializeToString()
# Deserialize back
hero2 = Hero()
hero2.ParseFromString(serialized)
# Use directly in gRPC services!
# Your SQLModel classes work seamlessly with gRPCA recent and currently supported version of Python.
As SQLModel is based on Pydantic and SQLAlchemy, it requires them. They will be automatically installed when you install SQLModel.
Additional requirement for this fork: protobuf>=5.29.5 (automatically installed).
Make sure you create a virtual environment, activate it, and then install this fork:
# Install from source (this fork)
$ uv pip install -e .
# Or install directly from git
$ uv pip install git+https://github.com/YOUR_USERNAME/grpcmodel.gitNote: For the original SQLModel without protobuf support, install from PyPI:
$ uv pip install sqlmodelFor an introduction to databases, SQL, and everything else, see the SQLModel documentation.
Here's a quick example. β¨
Imagine you have a SQL table called hero with:
idnamesecret_nameage
And you want it to have this data:
| id | name | secret_name | age |
|---|---|---|---|
| 1 | Deadpond | Dive Wilson | null |
| 2 | Spider-Boy | Pedro Parqueador | null |
| 3 | Rusty-Man | Tommy Sharp | 48 |
Then you could create a SQLModel model like this:
from sqlmodel import Field, SQLModel
class Hero(SQLModel, table=True):
id: int | None = Field(default=None, primary_key=True)
name: str
secret_name: str
age: int | None = NoneThat class Hero is a SQLModel model, the equivalent of a SQL table in Python code.
And each of those class attributes is equivalent to each table column.
Then you could create each row of the table as an instance of the model:
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)This way, you can use conventional Python code with classes and instances that represent tables and rows, and that way communicate with the SQL database.
Everything is designed for you to get the best developer experience possible, with the best editor support.
Including autocompletion:
And inline errors:
You can learn a lot more about SQLModel by quickly following the tutorial, but if you need a taste right now of how to put all that together and save to the database, you can do this:
from sqlmodel import Field, Session, SQLModel, create_engine
class Hero(SQLModel, table=True):
id: int | None = Field(default=None, primary_key=True)
name: str
secret_name: str
age: int | None = 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()That will save a SQLite database with the 3 heroes.
Then you could write queries to select from that same database, for example with:
from sqlmodel import Field, Session, SQLModel, create_engine, select
class Hero(SQLModel, table=True):
id: int | None = Field(default=None, primary_key=True)
name: str
secret_name: str
age: int | None = 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 was carefully designed to give you the best developer experience and editor support, even after selecting data from the database:
That class Hero is a SQLModel model.
But at the same time, β¨ it is a SQLAlchemy model β¨. So, you can combine it and use it with other SQLAlchemy models, or you could easily migrate applications with SQLAlchemy to SQLModel.
And at the same time, β¨ it is also a Pydantic model β¨. You can use inheritance with it to define all your data models while avoiding code duplication. That makes it very easy to use with FastAPI.
And now, β¨ it is also a protobuf Message β¨. You can serialize it to binary format, use it directly in gRPC services, and interact with any protobuf-based system without additional conversion layers.
This fork maintains 100% compatibility with the original SQLModel while adding:
- β All original SQLModel features work exactly as before
- β New protobuf/gRPC capabilities seamlessly integrated
- β Automatic descriptor generation (no extra code needed)
- β Backward compatible - existing code continues to work
This is a fork of the original SQLModel. For issues and contributions related to:
- Core SQLModel features: Please refer to the original SQLModel repository
- Protobuf/gRPC features: Please open issues in this repository
This project is licensed under the terms of the MIT license, same as the original SQLModel.



