sqlc-gen-better-python is a sqlc plugin that turns your
SQL schema and queries into modern, fully typed Python database code: models,
typed query functions, and enums. You keep writing SQL; the Python stays in
sync with it.
You write:
-- name: GetUser :one
SELECT * FROM users WHERE id = $1;and get back:
async def get_user(conn: ConnectionLike, *, id_: int) -> models.User | None:
row = await conn.fetchrow(GET_USER, id_)
if row is None:
return None
return models.User(id_=row[0], name=row[1])No ORM, no hand-written row unpacking. Generated code targets Python 3.12 or newer and passes pyright (strict) and ruff.
https://sqlc-gen-better-python.rayakame.dev/
- Getting Started - install the plugin and generate your first models.
- Guide - every feature, each with real generated output.
- Reference - all options, type mappings, and per-driver feature support.
Questions or feedback? Join the Discord.
- Four model types -
dataclass,attrs,msgspec, orpydantic(docs). - Seven drivers -
asyncpg,psycopg_async, andpsycopg_syncfor PostgreSQL,aiosqliteandsqlite3for SQLite, plus experimentalturso_asyncandturso_syncfor Turso (docs). - Typed query functions - one module per query file, one function per query (docs).
- PostgreSQL enums as
enum.StrEnumclasses (docs). - Type overrides and converters - swap a column's Python type, or plug in your own encode/decode functions (overrides, converters).
- Typed JSON columns via msgspec structs (docs).
- Optional docstrings in
google,numpy, orpep257convention (docs).
Every sqlc macro is supported. Which query commands are available depends on the driver - see the feature support matrix.
# filename: sqlc.yaml
version: "2"
plugins:
- name: python
wasm:
url: https://github.com/rayakame/sqlc-gen-better-python/releases/download/v0.8.0/sqlc-gen-better-python.wasm
sha256: c98cffe9024c3c8e802426a4babec460c2d17adc440181324e3d707b1e723c48
sql:
- engine: "postgresql"
queries: "query.sql"
schema: "schema.sql"
codegen:
- out: "app/db"
plugin: python
options:
package: "db"
emit_init_file: true
sql_driver: "asyncpg"
model_type: "msgspec"
Tip
No sqlc yet? Besides the official installation methods,
uv add --dev sqlc-bin (or pip install sqlc-bin) installs
sqlc-bin, the unmodified official
binaries as a pinnable Python package - no Go toolchain required.
More options at the sqlc config reference,
and the full plugin option list in the
configuration reference.
nMarkov - a Discord chatbot that learns from your server's messages and generates its own.
Using sqlc-gen-better-python in your project? Open an issue
to get listed here.
Contributions are very welcome, for more information and help please read the contribution guidelines.
Can be found here
Because of missing documentation about creating these plugins, this work is heavily inspired by:
Special thanks to tandemdude for answering my questions on discord.
