Razil
Explore posts from serversDTDrizzle Team
•Created by Razil on 4/10/2025 in #help
Drizzle Schema and TS
Hello, I have a question around how are we expected to consume the types from the schema generated by
then on the service if we want run an
Why is that? How we should correctly use it?
Thanks in advance 🙂
drizzle-kit pull
.
// schema.ts
export const user_points = pgTable(
'user_points',
{
user_id: uuid().primaryKey().notNull(),
// You can use { mode: "bigint" } if numbers are exceeding js number limitations
current: bigint({ mode: 'number' }).default(0).notNull(),
// You can use { mode: "bigint" } if numbers are exceeding js number limitations
spent: bigint({ mode: 'number' }).default(0).notNull(),
// You can use { mode: "bigint" } if numbers are exceeding js number limitations
total: bigint({ mode: 'number' }).default(0).notNull(),
updated_at: timestamp({ withTimezone: true, mode: 'string' }).defaultNow(),
created_at: timestamp({ withTimezone: true, mode: 'string' }).defaultNow(),
},
(table) => [
foreignKey({
columns: [table.user_id],
foreignColumns: [users.id],
name: 'user_points_user_id_fkey',
}).onDelete('cascade'),
check('user_points_current_check', sql`current >= 0`),
check('user_points_spent_check', sql`spent >= 0`),
check('user_points_total_check', sql`total >= 0`),
],
);
// schema.ts
export const user_points = pgTable(
'user_points',
{
user_id: uuid().primaryKey().notNull(),
// You can use { mode: "bigint" } if numbers are exceeding js number limitations
current: bigint({ mode: 'number' }).default(0).notNull(),
// You can use { mode: "bigint" } if numbers are exceeding js number limitations
spent: bigint({ mode: 'number' }).default(0).notNull(),
// You can use { mode: "bigint" } if numbers are exceeding js number limitations
total: bigint({ mode: 'number' }).default(0).notNull(),
updated_at: timestamp({ withTimezone: true, mode: 'string' }).defaultNow(),
created_at: timestamp({ withTimezone: true, mode: 'string' }).defaultNow(),
},
(table) => [
foreignKey({
columns: [table.user_id],
foreignColumns: [users.id],
name: 'user_points_user_id_fkey',
}).onDelete('cascade'),
check('user_points_current_check', sql`current >= 0`),
check('user_points_spent_check', sql`spent >= 0`),
check('user_points_total_check', sql`total >= 0`),
],
);
update
operation:
import { user_points } from '@/src/drizzle/schema';
// ✅ this will work
const [updated] = await db
.update(user_points)
.set({
[user_points.current.name]: newCurrent,
[user_points.spent.name]: newSpent,
[user_points.updated_at.name]: new Date(),
})
.where(eq(user_points.user_id, userId))
.returning();
// 💢 but used as:
const [updated] = await db
.update(user_points)
.set({
current: newCurrent,
spent: newSpent,
updated_at: new Date(),
})
.where(eq(user_points.user_id, userId))
.returning();
// will fail to infer the other columns and only `user_id` relation will be inferred
Object literal may only specify known properties, and 'current' does not exist in type '{ user_id?: string | SQL<unknown> | PgColumn<ColumnBaseConfig<ColumnDataType, string>, {}, {}>; }'.ts(2353)
import { user_points } from '@/src/drizzle/schema';
// ✅ this will work
const [updated] = await db
.update(user_points)
.set({
[user_points.current.name]: newCurrent,
[user_points.spent.name]: newSpent,
[user_points.updated_at.name]: new Date(),
})
.where(eq(user_points.user_id, userId))
.returning();
// 💢 but used as:
const [updated] = await db
.update(user_points)
.set({
current: newCurrent,
spent: newSpent,
updated_at: new Date(),
})
.where(eq(user_points.user_id, userId))
.returning();
// will fail to infer the other columns and only `user_id` relation will be inferred
Object literal may only specify known properties, and 'current' does not exist in type '{ user_id?: string | SQL<unknown> | PgColumn<ColumnBaseConfig<ColumnDataType, string>, {}, {}>; }'.ts(2353)
1 replies