选择字段
Prisma Client Python 支持选择模型的子集字段,以在适用时提高性能和安全性,例如,如果您的模型上有一个 hashed_password
字段。
目前,您必须提前定义选择,并且不能动态选择字段。这是因为使用动态语法无法静态类型化查询。有关潜在解决方案的讨论,请参阅 此问题。
用法
您可以通过两种方式定义可用于选择特定字段子集的模型类型。
提示
虽然这里概述了两种方法的优缺点,但由于您编写查询的方式不会改变,因此在两种方法之间切换应该相当简单。
第一种方法是使用 部分类型,当以下情况时应使用此方法:
- 您计划使用该特定模型编写多个查询
- 您知道您将对数据模型进行大量迭代,因为部分类型会随着模型的演变而无缝演变
第二种方法是 自己定义模型,这使得编写一次性查询或仅针对应用程序/数据模型的较小部分的查询变得更容易。
展开以显示示例 Prisma 模式
model User {
id String @id @default(cuid())
name String
country String
}
model Characters {
id String @id @default(cuid())
name String
strength Int
}
使用部分类型
您定义的任何部分类型也可以用于运行查询,例如
# partial type generator (e.g. `prisma/partial_types.py`)
from prisma.models import User
User.create_partial('UserWithName', include={'name'})
更新部分类型生成器并运行prisma generate
后,您可以像这样导入类型
from prisma.partials import UserWithName
有关使用示例,请参阅 编写查询 部分。
使用自定义模型
要定义您自己的自定义模型,您必须从prisma.bases
导入基本模型。所有基类都是使用Base${model_name}
格式定义的。
例如,具有Comment
模型的模式将定义一个名为BaseComment
的基类。
然后,您可以像使用 pydantic 一样定义您自己的模型。
例如,您可以像这样定义一个仅选择name
字段的User
模型
from prisma.bases import BaseUser
class UserWithName(BaseUser):
name: str
有关使用示例,请参阅 编写查询 部分。
编写查询
您可以使用与使用从prisma.models
导入的 模型 编写查询时相同的语法编写选择查询。
user = await UserWithName.prisma().find_first(
where={
'country': 'Scotland',
},
)
print(user.name)
如果您尝试访问自定义模型中不存在的字段,类型检查器将报告错误,并且在运行时将引发错误。
print(user.id) # error `id` does not exist on the `UserWithName` type
如您所见,您仍然可以查询未在模型本身中定义的字段,但 Prisma Client Python 仅选择存在的字段。
有关编写查询的更多详细信息,请参阅 模型操作 文档。
与关系字段的交互
警告
此功能处于实验阶段,可能会发生变化。有关讨论,请参阅 此问题。
在某些情况下,如果您编写了许多需要反复获取相同关系的查询,则必须在include
中显式指定它们可能会很麻烦且容易出错。
您可以通过将类型定义为非可选来告诉 Prisma Client Python 始终获取一对多关系,例如
from typing import List
from prisma.models import Character
from prisma.bases import BaseUser
class UserWithCharacters(BaseUser):
id: str
name: str
characters: List[Character]
user = await UserWithCharacters.prisma().find_unique(
where={
'id': '<user id>',
},
)
print(user.name)
print(user.characters[0].strength)
使用此UserWithCharacters
定义,只要您使用UserWithCharacters
模型运行查询,Prisma Client Python 就会始终获取characters
关系。
警告
不要在代码库的每个地方都使用此模式。关系查找可能很昂贵,如果使用不当会导致性能显着下降。
注意
目前无法将此模式与一对一关系字段一起使用,如果您希望支持此功能,请点赞或评论 此问题。