跳转到主要内容

面向命令行的ORM。

项目描述

clirm

命令行ORM(clirm)是一个库,可用于创建简单的ORM,在交互式环境中允许用户操作对象,并且定期运行遍历整个数据库的脚本。

功能包括

  • 更改总是立即提交到数据库,因此无需担心单独的后续“保存”步骤。
  • 每行只有一个对象,因此用户无需担心编辑一个副本而另一个ORM对象对应的同一行未更改。
  • 行中的所有列总是一起检索,以简化上述点的实现。
  • 与类型系统的紧密集成。字段可以声明为Field[T](),其中T是正常的Python类型。

Clirm要求每个表都有一个包含唯一标识符的id列。

用法

例如,我们将创建一个包含动物分类的简单数据库

import enum
import sqlite3
from typing import Self

from clirm import Clirm, Field, Model

class Status(enum.Enum):
    living = 1
    recently_extinct = 2
    fossil = 3

CLIRM = Clirm(sqlite3.connect("taxon.db"))

class Taxon(Model):
    clirm = CLIRM
    clirm_table_name = "taxon"

    name = Field[str]()  # string field
    status = Field[Status]()  # enum field
    common_name = Field[str | None]()  # nullable string field
    parent = Field[Self | None]()  # foreign key to self; can also write "Taxon | None"

if __name__ == "__main__":
    txn1 = Taxon.create(
        name="Mammalia", status=Status.living, common_name="Mammals"
    )
    txn2 = Taxon.create(
        name="Rodentia", status=Status.living, common_name="Rodents",
        parent=txn1
    )
    tnx3 = Taxon.create(
        name="Multituberculata", status=Status.fossil, parent=txn1
    )

    living_taxa = Taxon.select().filter(Taxon.status == Status.living)
    assert living_taxa.count() == 2
    assert {txn.common_name for txn in living_taxa} == {"Mammals", "Rodents"}
    for txn in living_taxa:
        txn.common_name = txn.common_name + "!"

    # Change is immediately visible
    assert txn1.common_name == "Mammals!"

支持类型

当前支持以下字段类型

  • 原始类型,例如intstrbool,它们直接传递到数据库
  • 枚举,它们在传递到数据库之前转换为它们的值
  • 指向其他clirm模型的键,它们以它们的ID存储
  • 指向当前类的键,可以用typing.Self表示
  • 上述任何类型的可空版本,通过在类型中添加| None表示

可以通过从Field派生并重写deserializeserialize方法来支持额外的类型。

后端

目前仅支持SQLite作为后端。

变更日志

版本 0.1(2024年4月8日)

  • 首次发布