Skip to main content

A type-safe ORM generator for Python, creating fully type-hinted database clients from plain dataclass definitions.

Project description

DataclassQL

DataclassQL 是一个基于 平凡 dataclass 定义 的 ORM 生成器, 可生成类型提示完整精巧的数据库客户端.

模型文件保持干净、直观, 无需起手加一堆导入, 也没有 mapped_column()Annotation 或额外的基类继承, 只需要 dataclass


设计目标

  • 最小语法负担: 模型定义就是合法平凡的 Python dataclass, Python 即 DSL
  • 常用路径简洁: 常用的定义只需要写少量的代码
  • 静态类型安全: 模型定义和生成代码全都类型安全. 本库作为 prisma client python 的精神继承者, 致力于完成如下体验:


示例

from dataclasses import dataclass
from datetime import datetime

@dataclass
class User:
    id: int
    name: str
    email: str
    last_login: datetime

    def index(self):
        yield self.name
        yield self.last_login

    def unique_index(self):
        yield self.name, self.email

写出如下代码时:

from dclassql import client

client.user.insert({
    "name": "Alice",
    "email": "test@example.com",
})

将在类型空间得到报错:

error: Argument of type "dict[str, str]" cannot be assigned to parameter "data" of type "UserInsertDict" in function "insert"
    "last_login" is required in "UserInsertDict" (reportArgumentType)

安装

uv add dclassql

当前状态

DataclassQL 仍在早期开发阶段, 已完成代码生成和 SQLite 支持, 后续将扩展更多数据库与查询功能.

一份更长的例子

from dataclasses import dataclass
from datetime import datetime

__datasource__ = {
    "provider": "sqlite",
    "url": "sqlite:///test.db",
}


@dataclass
class Address:
    id: int
    location: str
    user_id: int
    user: 'User'

    def foreign_key(self):
        yield self.user.id == self.user_id, User.addresses


@dataclass
class BirthDay:
    user_id: int
    user: 'User'
    date: datetime

    def primary_key(self):
        return self.user_id

    def foreign_key(self):
        yield self.user.id == self.user_id, User.birthday


@dataclass
class Book:
    id: int
    name: str
    users: list['UserBook']

    def index(self):
        return self.name


@dataclass
class UserBook:
    user_id: int
    book_id: int
    user: 'User'
    book: Book
    created_at: datetime

    def primary_key(self):
        return (self.user_id, self.book_id)

    def index(self):
        yield self.created_at

    def foreign_key(self):
        yield self.user.id == self.user_id, User.books
        yield self.book.id == self.book_id, Book.users


@dataclass
class User:
    id: int | None
    name: str
    email: str
    last_login: datetime
    birthday: BirthDay | None
    addresses: list[Address]
    books: list[UserBook]

    def index(self):
        yield self.name
        yield self.name, self.email
        yield self.last_login

    def unique_index(self):
        yield self.name, self.email

生成的代码请见: https://github.com/myuanz/dataclassql/blob/master/tests/results.py

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dclassql-0.1.2.tar.gz (30.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

dclassql-0.1.2-py3-none-any.whl (42.6 kB view details)

Uploaded Python 3

File details

Details for the file dclassql-0.1.2.tar.gz.

File metadata

  • Download URL: dclassql-0.1.2.tar.gz
  • Upload date:
  • Size: 30.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.0

File hashes

Hashes for dclassql-0.1.2.tar.gz
Algorithm Hash digest
SHA256 751d83b718b1ea5be0367a3f4e08038e4a4b8b30b293bcfaf56411ac623c8492
MD5 a79023cf5434ca35c74ea35af7270dfb
BLAKE2b-256 f6eadae8e8d39811d39ae3806070b40c4d49d3528d6ed31dcb6e3f55f8ca2ddb

See more details on using hashes here.

File details

Details for the file dclassql-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: dclassql-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 42.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.0

File hashes

Hashes for dclassql-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 3d42a114b4c20718e46a9a8a0846e37b6856a1be5e547778f0ce7507d59d9afb
MD5 2dd93116f90058370d5f0bf9e53c4efc
BLAKE2b-256 7edd06a5047212018b4eb01c9021794836a2eff61516deffc53c70e959f6c62f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page