drizzle-team / drizzle-team/drizzle-orm
[FEATURE]: Enhanced Metadata Support for Cloudflare D1
- Dominant language
- TypeScript
- Stars
- 35.8k
- Forks
- 1.6k
- Avg merge
- 2d 7h
- Merged PRs (30d)
- 4
Description
The Cloudflare D1 API can provide valuable metadata, including [operation duration and rows read](https://developers.cloudflare.com/d1/reference/client-api/#return-object). As D1 pricing is based on rows read, incorporating this metadata into Drizzle queries would be immensely beneficial.
PlanetScale users may also want to measure the number of rows for each query.
I would like to get this metadata with each query result while taking advantage of all Drizzle features.
I think a way to return metadata should meet the following constraints:
1. Don't complicate the TypeScript types more
2. Support Select Mode, Batch Mode and Drizzle Query mode
3. Keep it ergonomic to get the query result and metadata together
Here are a few rough API ideas:
1. Return tuples with metadata
```ts
const [result, meta] = await drizzle.select().from(users).withMetadata().all();
const [[users, usersMeta], [posts, postsMeta]] = await drizzle.batch(
[drizzle.select().from(users), drizzle.select().from(posts)],
{ metadata: true },
);
const [result, meta] = await db.query.users.findMany({
metadata: true
});
```
2. Mutate a meta object on the drizzle instance
```ts
const result = await drizzle.select().from(users).withMetadata().all();
const meta = drizzle.meta;
const [users, post] = await drizzle.batch(
[drizzle.select().from(users), drizzle.select().from(posts)],
{ metadata: true },
);
const usersMeta = drizzle.batchMeta[0];
const postsMeta = drizzle.batchMeta[1]
const result = await drizzle.query.users.findMany({
metadata: true
});
const meta = drizzle.meta;
```
3. Use a callback for metadata
```ts
let meta = null;
const result = await drizzle
.select()
.from(users)
.onMetadata((m) => {
meta = m;
})
.all();
const meta = drizzle.meta;
let usersMeta = null;
let postsMeta = null;
const [users, post] = await drizzle.batch(
[drizzle.select().from(users), drizzle.select().from(posts)],
{
onMetadata: (m) => {
usersMeta = m[0];
postsMeta = m[1];
},
},
);
const usersMeta = drizzle.batchMeta[0];
const postsMeta = drizzle.batchMeta[1];
let meta = null;
const result = await drizzle.query.users.findMany({
onMetadata: (m) => {
meta = m;
},
});
```
## Related features
I saw there is also [experimental OpenTelemetry support](https://github.com/search?q=repo%3Adrizzle-team%2Fdrizzle-orm%20startActiveSpan&type=code). Ultimately if metadata can be exposed from Drivers, I think it should be available both with the associated query result and also in any tracing implementation like that.
Contributor guide
Assessment
This issue has not been assessed yet.