drizzle-team / drizzle-team/drizzle-orm
[FEATURE]: pick columns from `getTableColumns`
- 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
Assessment
This issue has not been assessed yet.