Starting from drizzle-orm@1.0.0-beta.15, drizzle-arktype has been deprecated in favor of first-class schema generation support within Drizzle ORM itself
You can still use drizzle-arktype package but all new update will be added to Drizzle ORM directly
arktype
Install the dependencies
npm
yarn
pnpm
bun
npm i arktype
yarn add arktype
pnpm add arktype
bun add arktype
Select schema
Defines the shape of data queried from the database - can be used to validate API responses.
import { pgTable, text, integer } from 'drizzle-orm/pg-core';import { createSelectSchema } from 'drizzle-orm/arktype';const users = pgTable('users', { id: integer().generatedAlwaysAsIdentity().primaryKey(), name: text().notNull(), age: integer().notNull()});const userSelectSchema = createSelectSchema(users);const rows = await db.select({ id: users.id, name: users.name }).from(users).limit(1);const parsed: { id: number; name: string; age: number } = userSelectSchema(rows[0]); // Error: `age` is not returned in the above queryconst rows = await db.select().from(users).limit(1);const parsed: { id: number; name: string; age: number } = userSelectSchema(rows[0]); // Will parse successfully
Defines the shape of data to be inserted into the database - can be used to validate API requests.
import { pgTable, text, integer } from 'drizzle-orm/pg-core';import { createInsertSchema } from 'drizzle-orm/arktype';const users = pgTable('users', { id: integer().generatedAlwaysAsIdentity().primaryKey(), name: text().notNull(), age: integer().notNull()});const userInsertSchema = createInsertSchema(users);const user = { name: 'John' };const parsed: { name: string, age: number } = userInsertSchema(user); // Error: `age` is not definedconst user = { name: 'Jane', age: 30 };const parsed: { name: string, age: number } = userInsertSchema(user); // Will parse successfullyawait db.insert(users).values(parsed);
Update schema
Defines the shape of data to be updated in the database - can be used to validate API requests.
import { pgTable, text, integer } from 'drizzle-orm/pg-core';import { createUpdateSchema } from 'drizzle-orm/arktype';import { parse } from 'arktype';const users = pgTable('users', { id: integer().generatedAlwaysAsIdentity().primaryKey(), name: text().notNull(), age: integer().notNull()});const userUpdateSchema = createUpdateSchema(users);const user = { id: 5, name: 'John' };const parsed: { name?: string | undefined, age?: number | undefined } = userUpdateSchema(user); // Error: `id` is a generated column, it can't be updatedconst user = { age: 35 };const parsed: { name?: string | undefined, age?: number | undefined } = userUpdateSchema(user); // Will parse successfullyawait db.update(users).set(parsed).where(eq(users.name, 'Jane'));
Refinements
Each create schema function accepts an additional optional parameter that you can used to extend, modify or completely overwite a field’s schema. Defining a callback function will extend or modify while providing a arktype schema will overwrite it.