drizzle-team / drizzle-team/drizzle-orm

[FEATURE]: Enhanced Metadata Support for Cloudflare D1

Open
#1,811 2 comments 12 reactions 0 assignees View on GitHub
enhancement
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.