一个简单的异步ORM,考虑了fastapi和pydantic验证。

ormar的Python项目详细描述


奥马尔

Pypi versionPypi versionBuild StatusCoverageCodeFactorCodacy

概述

ormar包是Python的异步迷你ORM,支持Postgres, MySQLSQLite。在

使用ormar的主要好处是:

  • 获取可用于异步框架的async ORM(fastapi、starlette等)
  • 只需维护一个模型—您不必维护pydantic和其他orm模型(sqlalchemy、peewee、gino等)

目标是创建一个简单的ORM,它可以^{str1}$直接与^{}一起使用(作为请求和响应模型),它的数据验证基于pydantic。在

Ormar——除了名字中明显的ORM之外——它的名字来源于Ormar在瑞典语中的意思是蛇,Ormar(e)在意大利语中是cabinet的意思。在

对于python ORM,还有什么比snakes cabinet更好的名称:)

文档

查看documentation了解详细信息。在

依赖性

Ormar由以下部件构成:

  • ^{}用于查询生成。在
  • ^{}支持跨数据库异步。在
  • ^{}用于数据验证。在
  • typing_extensions用于python3.6-3.7

迁移

因为ormar构建在SQLAlchemy核心之上,所以可以使用^{}来提供 数据库迁移。在

ormar仍在开发中: 我们建议固定任何依赖项(即ormar~=0.5.2

快速启动

Note:使用ipython从控制台尝试此操作,因为它支持await。在

importdatabasesimportormarimportsqlalchemydatabase=databases.Database("sqlite:///db.sqlite")metadata=sqlalchemy.MetaData()classAlbum(ormar.Model):classMeta:tablename="album"metadata=metadatadatabase=database# note that type hints are optional so # id = ormar.Integer(primary_key=True) # is also validid:int=ormar.Integer(primary_key=True)name:str=ormar.String(max_length=100)classTrack(ormar.Model):classMeta:tablename="track"metadata=metadatadatabase=databaseid:int=ormar.Integer(primary_key=True)album:Optional[Album]=ormar.ForeignKey(Album)title:str=ormar.String(max_length=100)position:int=ormar.Integer()# Create some records to work with.malibu=awaitAlbum.objects.create(name="Malibu")awaitTrack.objects.create(album=malibu,title="The Bird",position=1)awaitTrack.objects.create(album=malibu,title="Heart don't stand a chance",position=2)awaitTrack.objects.create(album=malibu,title="The Waters",position=3)# alternative creation of object divided into 2 stepsfantasies=Album(name="Fantasies")awaitfantasies.save()awaitTrack.objects.create(album=fantasies,title="Help I'm Alive",position=1)awaitTrack.objects.create(album=fantasies,title="Sick Muse",position=2)# Fetch an instance, without loading a foreign key relationship on it.track=awaitTrack.objects.get(title="The Bird")# We have an album instance, but it only has the primary key populatedprint(track.album)# Album(id=1) [sparse]print(track.album.pk)# 1print(track.album.name)# None# Load the relationship from the databaseawaittrack.album.load()asserttrack.album.name=="Malibu"# This time, fetch an instance, loading the foreign key relationship.track=awaitTrack.objects.select_related("album").get(title="The Bird")asserttrack.album.name=="Malibu"# By default you also get a second side of the relation # constructed as lowercase source model name +'s' (tracks in this case)# you can also provide custom name with parameter related_namealbum=awaitAlbum.objects.select_related("tracks").all()assertlen(album.tracks)==3# Fetch instances, with a filter across an FK relationship.tracks=Track.objects.filter(album__name="Fantasies")assertlen(tracks)==2# Fetch instances, with a filter and operator across an FK relationship.tracks=Track.objects.filter(album__name__iexact="fantasies")assertlen(tracks)==2# Limit a querytracks=awaitTrack.objects.limit(1).all()assertlen(tracks)==1

Ormar规范

查询集方法

  • create(**kwargs): -> Model
  • get(**kwargs): -> Model
  • get_or_create(**kwargs) -> Model
  • update(each: bool = False, **kwargs) -> int
  • update_or_create(**kwargs) -> Model
  • bulk_create(objects: List[Model]) -> None
  • bulk_update(objects: List[Model], columns: List[str] = None) -> None
  • delete(each: bool = False, **kwargs) -> int
  • all(**kwargs) -> List[Optional[Model]]
  • filter(**kwargs) -> QuerySet
  • exclude(**kwargs) -> QuerySet
  • select_related(related: Union[List, str]) -> QuerySet
  • prefetch_related(related: Union[List, str]) -> QuerySet
  • limit(limit_count: int) -> QuerySet
  • offset(offset: int) -> QuerySet
  • count() -> int
  • exists() -> bool
  • fields(columns: Union[List, str, set, dict]) -> QuerySet
  • exclude_fields(columns: Union[List, str, set, dict]) -> QuerySet
  • ^{cd31}

关系类型

  • 一对多-使用ForeignKey(to: Model)
  • 多对多-使用ManyToMany(to: Model, through: Model)

模型字段类型

可用的模型字段(带必需的参数-文档中的可选参数):

  • String(max_length)
  • Text()
  • Boolean()
  • Integer()
  • Float()
  • Date()
  • Time()
  • DateTime()
  • JSON()
  • BigInteger()
  • Decimal(scale, precision)
  • UUID()
  • ForeignKey(to)
  • ManyToMany(to, through)

可用字段选项

所有字段类型都支持以下关键字参数。在

  • primary_key: bool
  • nullable: bool
  • default: Any
  • server_default: Any
  • index: bool
  • unique: bool
  • choices: typing.Sequence
  • name: str
  • pydantic_only: bool

除非设置了以下任一项,否则所有字段都是必需的:

  • nullable-创建一个可为空的列。将默认值设置为None。在
  • default-设置字段的默认值。在
  • server_default-为服务器端的字段设置一个默认值(比如sqlalchemy的func.now())。在
  • ^当cd62>上的一个列的时,该列的auto{63>被设置为。 自动增量在int主键上默认设置。在
  • pydantic_only-字段仅作为普通pydantic字段可用,不存储在数据库中。在

可用信号

信号允许为给定模型上的给定事件触发函数。在

  • pre_save
  • post_save
  • pre_update
  • post_update
  • pre_delete
  • post_delete

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java为什么程序显示空结果?   java应用程序在测试设备上调试时工作正常,但在发布版apk中没有,它没有获得post。来自firebase的类变量   java Android:从主活动按钮确定在listview中选中哪个复选框   在Spring中添加@OneToOne注释时启动ApplicationContext时发生java错误   用JAVA Android实现矩阵计算的最快方法   SpringJava语义有没有更好的编写方法?   java从hashmap中减去两个值后返回最小差值的键?   Java中的静态初始化顺序:Netty 4.0.7的例外   java如何检查用户输入是否为字符串   循环Java计数单词索引   java如何使用以下代码将视频流传输到Android异步Http服务器?   java如何在jtable的所有行中循环   java如何使用maven将unicode插入mysql   java使用安卓加速远程数据检索   java试图模拟麦克风(javax.sound.sampled)   swing SwingWorker从不归还任何东西?(爪哇)   首次在Android Studio上未加载java LibGDX文件   java如何在多个Mysql服务器上设置限制和偏移?   如何防止从java连接到mongodb时登录控制台?