扫描二维码

关注或者微信搜一搜:编程智域 前端至全栈交流与成长

发现1000+提升效率与开发的AI工具和实用程序https://tools.cmdragon.cn/

1. GraphQL类型系统基础

  • 标量类型:FastAPI支持String/Int/Float/Boolean/ID等基础类型
  • 对象类型示例:
# 使用pydantic定义数据模型
from pydantic import BaseModel class UserProfile(BaseModel):
id: int
username: str
age: int = Field(ge=18, description="必须年满18岁")
email: str = Field(pattern=r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$")
  • 枚举类型定义方法:
from enum import Enum

class UserStatus(str, Enum):
ACTIVE = "active"
INACTIVE = "inactive"
SUSPENDED = "suspended"

2. Schema定义规范

graph TD
A[Schema根类型] --> B[Query]
A --> C[Mutation]
B --> D{字段}
D --> E[参数]
D --> F[返回类型]

3. 类型系统高级特性

  • 输入类型输出类型分离原则:
# 输入模型(接收客户端数据)
class UserCreate(BaseModel):
username: str
password: str # 输出模型(返回响应数据)
class UserOut(BaseModel):
id: int
username: str
create_time: datetime

4. 与RESTful对比

# RESTful端点示例
@app.get("/users/{user_id}")
def get_user(user_id: int): # ... # GraphQL等效查询
type Query {
getUser(userId: Int!): User
}

5. 完整示例

# 安装依赖:fastapi==0.95.2 strawberry-graphql==0.155.3 pydantic==1.10.7

from fastapi import FastAPI
import strawberry
from strawberry.asgi import GraphQL @strawberry.type
class Product:
id: int
name: str
price: float @strawberry.type
class Query:
@strawberry.field
def get_product(self, id: int) -> Product:
# 实际应从数据库获取
return Product(id=id, name="Sample", price=99.9) schema = strawberry.Schema(query=Query)
app = FastAPI()
app.add_route("/graphql", GraphQL(schema))

课后Quiz

Q1:如何定义返回手机号格式的字段?

A) 使用String类型

B) 使用正则表达式校验

C) 创建自定义标量类型

正确答案:C。可通过定义标量类型实现格式验证:

@strawberry.scalar
class PhoneNumber:
@staticmethod
def serialize(value: str) -> str:
if not re.match(r'^1[3-9]\d{9}$', value):
raise ValueError("Invalid phone number")
return value

报错处理

问题:查询返回"ValueError: Expected 'User' type"

解决方案:

  1. 检查模型继承是否正确
  2. 确认字段类型与数据库类型匹配
  3. 验证数据序列化过程

    预防建议:
  • 使用mypy进行静态类型检查
  • 编写单元测试验证类型转换

余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长

,阅读完整的文章:GraphQL类型系统如何让FastAPI开发更高效?

往期文章归档:

免费好用的热门在线工具

GraphQL类型系统如何让FastAPI开发更高效?的更多相关文章

  1. 这些小工具让你的Android 开发更高效

    在做Android 开发过程中,会遇到一些小的问题.尽管自己动手也能解决.可是有了一些小工具,解决这些问题就得心应手了,今天就为大家推荐一下Android 开发遇到的小工具,来让你的开发更高效. Vy ...

  2. UML之轻松入门(2)-掌握Junit,让我们的开发更高效

         使用UML不仅能够形象化的表达我们的程序思想,并且能够帮助我们提高程序的质量.一个杂乱无章的程序让维护者望而生畏,其成本也可想而知.在面向程序设计(OOD)中有5条原则是帮助我们设计一个高效 ...

  3. testNG优雅的使用注解让你的测试项目开发更高效!

    testNG大部分是通过xml配置测试类和监听类 但是这种方法就像传统的spring框架一样需要引入大量的xml配置信息,而且在各层之间也需要通过new对象传递.如果testNG能使用注解注入bean ...

  4. “体检医生”黑科技|让AI开发更精准,ModelArts更新模型诊断功能

    摘要:华为云AI开发平台ModelArts黑科技加持AI研发,让模型开发更高效.更简单,降低AI在行业的落地门槛.全面的可视化评估以及智能诊断功能,使得开发者可以直观了解模型各方面性能,从而进行针对性 ...

  5. 微服务平台(Micro Service Platform : MSP)旨在提供一个集开发、测试、运维于一体的开发者专属平台,让开发者能快速构建或使用微服务,让开发更简单,让运维更高效。

    微服务平台(Micro Service Platform : MSP)旨在提供一个集开发.测试.运维于一体的开发者专属平台,让开发者能快速构建或使用微服务,让开发更简单,让运维更高效. MSP采用业界 ...

  6. 如何更高效地定制你的bootstrap

    bootstrap已经作为前端开发必不可少的框架之一,应用bootstrap使得我们对布局.样式的设定变得非常简单.但bootstrap提供的默认样式往往不能满足我们的需求,从而定制化bootstra ...

  7. 如何使代码审查更高效【摘自InfoQ】

      代码审查者在审查代码时有非常多的东西需要关注.一个团队需要明确对于自己的项目哪些点是重要的,并不断在审查中就这些点进行检查. 人工审查代码是十分昂贵的,因此尽可能地使用自动化方式进行审查,如:代码 ...

  8. 云如何让App开发更简单?

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 互联网"下半场",移动App开发对于质量.速度的要求更加苛刻.4月初,腾讯云正式上线移动开发平台MobileLine,借 ...

  9. 25个让Java程序员更高效的Eclipse插件

    Eclipse提供了一个可扩展插件的开发系统.这就使得Eclipse在运行系统之上可以实现各种功能.这些插件也不同于其他的应用(插件的功能是最难用代码实现的).拥有合适的Eclipse插件是非常重要的 ...

  10. 让开发更简单 —— Coding Enterprise 发布

    今天,我们很高兴地宣布 Coding Enterprise 发布了 —— Coding Enterprise 是 CODING 专为企业打造的软件开发协作平台,提供了针对中小型企业的公有云版本和针对大 ...

随机推荐

  1. hadoop集群搭建(亲测笔记)

    ------步骤: 准备3台机器 同步时间 配置主机名 配置主机名ip映射 免密登录 关闭防火墙 搭建zookeeper集群 搭建hadoop 准备3台机器 我通过VMware workstation ...

  2. 安卓智能手机芯片上audio的bringup

    基于安卓平台的智能手机芯片回来后要做bringup.首先是负责平台的把安卓OS起来,然后就轮到各功能模块做bringup了,Audio是其中主要功能模块之一.Audio由于场景多和牵涉到的core多, ...

  3. GitLab——重置(reset)和还原(revert)

    Git 命令 reset 和 revert 的区别 - 知乎 (zhihu.com) 总结: git reset --hard 9201d9b19dbf5b4ceaf90f92fd4e4019b685 ...

  4. 【记录】Docker|Ubuntu Docker 修改dockerfile换源、主机共享网络解决apt update 失败

    本文测试环境:虚拟机 Ubuntu20.04 Docker20 1 修改dockerfile dockerfile第二行后面加如下内容,一键换源: RUN sed -i s:/archive.ubun ...

  5. 【BLIP】解读BLIP

    BLIP,全称是Bootstrapped Language-Image Pretraining,源自<BLIP: Bootstrapping Language-Image Pre-trainin ...

  6. Web前端入门第 49 问:CSS offset 路径动画演示

    什么是路径动画? 随手画一条不规则的线,让元素按照这条不规则的线运动起来,这就是所谓的路径动画. 前面说过的动画都只能针对某一个 CSS 属性,要想实现路径动画可没办法,路径动画必须借助 CSS3 的 ...

  7. 理解 C# 中的各类指针

    目录 前言 对象引用(Object Reference) 指针(Pointer) 指针的声明和使用 指针可以指向的位置 可以声明指针的位置 指向值类型变量的指针 指向对象引用的指针 指向 GC Hea ...

  8. Vue最新面试攻略

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  9. .NET外挂系列:1. harmony 基本原理和骨架分析

    一:背景 1. 讲故事 为什么要开这么一个系列,是因为他可以对 .NET SDK 中的方法进行外挂,这种技术对解决程序的一些疑难杂症特别有用,在.NET高级调试 领域下大显神威,在我的训练营里也是花了 ...

  10. C#之结构

    结构是用户定义的数据类型,与类非常相似,它们有数据成员和函数成员,但与类最重要的区别是:类是引用类型,而结构是值类似,结构是隐式密封的,这意味这它们不能被派生,所以结构类型不能为null,两个结构变量 ...