@@ -5,41 +5,24 @@ While not a key-value store, SQL offers a natural batch mechanism with
5
5
stores, it is still suited for SQL when queries remain simple. This example
6
6
requests the entire row at a given ` id ` , however your usage may differ.
7
7
8
- This example uses the [ sqlite3] [ ] client which offers a ` parallelize ` method to
9
- further batch queries together. Another non-caching ` DataLoader ` utilizes this
10
- method to provide a similar API. ` DataLoaders ` can access other ` DataLoaders ` .
11
-
12
8
``` js
13
9
const DataLoader = require (' dataloader' )
14
10
const sqlite3 = require (' sqlite3' )
15
11
16
12
const db = new sqlite3.Database (' ./to/your/db.sql' )
17
13
18
14
// Dispatch a WHERE-IN query, ensuring response has rows in correct order.
19
- const userLoader = new DataLoader (async ids => {
20
- const params = ids .map (id => ' ?' ).join ()
21
- const query = ` SELECT * FROM users WHERE id IN (${ params} )`
22
- const rows = await queryLoader .load ([query, ids])
23
- return ids .map (
24
- id => rows .find (row => row .id === id) || new Error (` Row not found: ${ id} ` )
25
- )
26
- })
27
-
28
- // Parallelize all queries, but do not cache.
29
- const queryLoader = new DataLoader (queries => new Promise (resolve => {
30
- const waitingOn = queries .length
31
- const results = []
32
- db .parallelize (() => {
33
- queries .forEach ((query , index ) => {
34
- db .all .apply (db, query .concat ((error , result ) => {
35
- results[index] = error || result
36
- if (-- waitingOn === 0 ) {
37
- resolve (results)
38
- }
39
- }))
40
- })
41
- })
42
- }), { cache: false })
15
+ const userLoader = new DataLoader (ids => new Promise ((resolve , reject ) => {
16
+ db .all (' SELECT * FROM users WHERE id IN $ids' , {$ids: ids}, (error , rows ) => {
17
+ if (error) {
18
+ reject (error);
19
+ } else {
20
+ resolve (ids .map (
21
+ id => rows .find (row => rows .id === id) || new Error (` Row not found: ${ id} ` )
22
+ ));
23
+ }
24
+ });
25
+ }));
43
26
44
27
// Usage
45
28
0 commit comments