一个简单的异步ORM,考虑了fastapi和pydantic验证。
ormar的Python项目详细描述
奥马尔
概述
ormar
包是Python的异步迷你ORM,支持Postgres,
MySQL和SQLite。在
使用ormar
的主要好处是:
- 获取可用于异步框架的async ORM(fastapi、starlette等)
- 只需维护一个模型—您不必维护pydantic和其他orm模型(sqlalchemy、peewee、gino等)
目标是创建一个简单的ORM,它可以^{str1}$直接与^{
Ormar——除了名字中明显的ORM之外——它的名字来源于Ormar在瑞典语中的意思是蛇,Ormar(e)在意大利语中是cabinet的意思。在
对于python ORM,还有什么比snakes cabinet更好的名称:)
文档
查看documentation了解详细信息。在
依赖性
Ormar由以下部件构成:
迁移
因为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
- 项目
标签: