Database schema
Learn how to extend and modify the database schema
It is recommended to learn more about Drizzle before diving into these guides.
Modifing the schema
The database schema is managed by Drizzle ORM in lives in packages/db/src/db.ts
.
Tables are defined in separate schema files, packages/db/src/[table]/[table].sql.ts
.
Adding a new table
Let's add a new database table for a simple todo list.
Go ahead a create a new file in packages/db/src/todos/todos.sql.ts
with the following content.
import { varchar } from 'drizzle-orm/pg-core'import { pgTable } from '../_table'import { timestamps, workspaceId, userId } from '../utils'export const todos = pgTable('todos', {...workspaceId,userId: userId('user_id'),todo: varchar('avatar', { length: 255 }),...timestamps,})
Let's dissect what's going on here.
We imported pgTable
from ../_table
, this is a custom table creator that allows you to prefix your tables in order to use the same database for multiple projects.
The workspaceId,
is a utility that adds a primary key and workspaceId to the table. userId('user_id')
is utility to create columns that contain user ids.
Lastly timestamps
will add a created_at
and updated_at
column to our table.
To use our new todos table with Drizzle ORM we need to import it and add it to our schema.
Open packages/db/src/db.ts
, import todos.sql.ts
and add it to the schema
object.
import * as todos from './todos/todos.sql'const schema = {// other tables...todos,}
That's it, now we can update the database and query the new table.
Migrating changes
For testing purposes you can run yarn db:push
to push the changes to your local database.
Use yarn db:migrate
to create a new migration.
Conventions
-
Schema file extensions are prefixed with
.sql
, egtodos.sql.ts
. Drizzle Kit will automatically stitch these files together in a single schema. -
ID's use Cuid2. Cuid2 ID's are secure, collision-resistant ids optimized for horizontal scaling and performance.
-
Table names are plural, eg
todos
,workspaces
, etc.
Utilities
The database package ships with a set of reusable utilities to help you build consistent schemas.
Name | Description | Usage |
---|---|---|
createId | Create a new CUID2 id | createId() |
workspaceId | Define the primary key and workspaceId on a table | ...workspaceId |
id | Define the primary key will create a new CUID2 on insert | ...id |
timestamps | Defines created_at and updated_at columns using timestampz | ...timestamps |
userId | Returns column definition for columns that contain a userId | userId('column_name') |
Was this helpful?