Merge pull request #1042 from onx2/onx2/dataloader-docs

Update Dataloader docs
This commit is contained in:
Sunli 2022-08-29 20:03:41 +08:00 committed by GitHub
commit 3ae4c7ca7a

View File

@ -7,7 +7,13 @@ Have you noticed some GraphQL queries end can make hundreds of database queries,
Imagine if you have a simple query like this: Imagine if you have a simple query like this:
```graphql ```graphql
query { todos { users { name } } } query {
todos {
users {
name
}
}
}
``` ```
and `User` resolver is like this: and `User` resolver is like this:
@ -30,7 +36,7 @@ impl User {
} }
``` ```
The query executor will call the `Todos` resolver which does a `select * from todo and return N todos`. Then for each The query executor will call the `Todos` resolver which does a `select * from todo and return N todos`. Then for each
of the todos, concurrently, call the `User` resolver, `SELECT from USER where id = todo.user_id`. of the todos, concurrently, call the `User` resolver, `SELECT from USER where id = todo.user_id`.
eg eg
@ -55,7 +61,7 @@ SELECT name FROM user WHERE id = $1
SELECT name FROM user WHERE id = $1 SELECT name FROM user WHERE id = $1
``` ```
After executing `SELECT name FROM user WHERE id = $1` many times, and most `Todo` objects belong to the same user, we After executing `SELECT name FROM user WHERE id = $1` many times, and most `Todo` objects belong to the same user, we
need to optimize these codes! need to optimize these codes!
## Dataloader ## Dataloader
@ -90,11 +96,13 @@ impl Loader<u64> for UserNameLoader {
} }
} }
#[derive(SimpleObject)]
#[graphql(complex)]
struct User { struct User {
id: u64, id: u64,
} }
#[Object] #[ComplexObject]
impl User { impl User {
async fn name(&self, ctx: &Context<'_>) -> Result<String> { async fn name(&self, ctx: &Context<'_>) -> Result<String> {
let loader = ctx.data_unchecked::<DataLoader<UserNameLoader>>(); let loader = ctx.data_unchecked::<DataLoader<UserNameLoader>>();