drizzle-team / drizzle-team/drizzle-orm

[FEATURE]: pick columns from `getTableColumns`

Open
#3,034 8 comments 12 reactions 0 assignees View on GitHub
improvement qb/crud
Dominant language
TypeScript
Stars
35.8k
Forks
1.6k
Avg merge
2d 7h
Merged PRs (30d)
4

Description

### Describe what you want

Current `getTableColumns()` does not support partial select.

You need to destructure and leave unused variables behind:

https://orm.drizzle.team/docs/goodies#get-table-information

```ts
// password, role is unused
const { password, role, ...rest } = getTableColumns(user);

await db.select({ ...rest }).from(users);
```

https://orm.drizzle.team/docs/select#advanced-select

```ts
// available starting from `drizzle-orm@1.0.0-beta.2`
import { getColumns } from 'drizzle-orm';

const { content, ...rest } = getColumns(posts); // exclude "content" column
await db.select({ ...rest }).from(posts); // select all other columns
```

I hope `pickTableColumns` is provided by Drizzle for better DX.

```ts
// { id: string; code: string }[];
const select1 = await db
.select(pickTableColumns(loginTable, ['id', 'code'])) //
.from(loginTable);

// { contact: string; id: string; code: string }[];
const select2 = await db
.select({
...pickTableColumns(loginTable, ['id', 'code']),
...pickTableColumns(userTable, ['contact'])
})
.from(loginTable)
.innerJoin(userTable, eq(userTable.id, loginTable.userId));
```

This is the source code I am using:

```ts
import { getTableColumns, type Table } from 'drizzle-orm';

export const pickTableColumns = <
T extends Table, //
const ColumnName extends keyof T['_']['columns']
>(
table: T,
columnNames: ColumnName[]
) => {
type Picked = Pick;
const picked: Partial = {};
const columns = getTableColumns(table);
for (const columnName of columnNames) {
picked[columnName] = columns[columnName];
}
return picked as Picked;
};
```

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.