Code Monkey home page Code Monkey logo

prisma-generator-drizzle's Introduction

prisma-generator-drizzle

Test

prisma-generator-drizzle is a Prisma generator that lets you generate a Drizzle schema. It is specifically designed for (existing) projects that are using Prisma and want to migrate to Drizzle, or for projects that want to use both Prisma and Drizzle together.

In this version, the focus is still on the query and mutation capabilities of the generated Drizzle schema.

Features

CleanShot.2023-12-25.at.01.11.37.mp4
  • ๐Ÿค 1:1 Prisma to Drizzle schema generation
  • โœจ Compatible with all *scalars, enums, and *constraints
  • ๐Ÿ“ฆ Supports drizzle relational query
  • ๐Ÿš€ Generates drizzle-specific features like the .$type<..>() method

*Only supports default scalar for now and more constraints will be added in future

This project is still considered as experimental, but you can safely use it for production. Follow the progress on v1.

Installation

1. Install the package

npm install -D prisma-generator-drizzle
npm install drizzle-orm

2. Add to your Prisma schema

generator drizzle {
  provider = "prisma-generator-drizzle"

  // Specify the output directory
  // output = "./lib/drizzle/models"
}

See configuration for more options.

3. Run the generator

prisma generate

Usages

Note: This generator will use the default Prisma field mapping, meaning any @db.* modifiers will be ignored for now.

prisma-generator-drizzle aims for 1:1 compatibility with Prisma, this means that you can use the generated Drizzle schema as a complete and familiar drop-in replacement for the Prisma client.

In addition to the Prisma features, you can also generate Drizzle-specific features:

Directive syntax is still experimental, feel free to suggest a better approach.

  1. Generate .$defaultFn<..>()
  2. Generate .$type<..>()

Configuration

Key Description Default Example
output Change the output "./drizzle" "../models"
Generate single output file "drizzle.ts"
formatter Run prettier after generation - "prettier"
relationalQuery Flag to generate relational query true false
moduleResolution Specify the module resolution that will affect the import style *auto nodenext
verbose Flag to enable verbose logging - true
abortOnFailedFormatting Flag to throw exception when formatting fails true false
**dateMode Change the generated mode for date "date"

* It will find the closest tsconfig from the current working directory. Note that extends is not supported

**Does not work with sqlite

Setting up relational query

import { drizzle } from 'drizzle-orm/node-postgres'

// `schema` contains all table and relation definitions
import { schema } from 'prisma/drizzle/schema'

const client = ... // database client
const db = drizzle(client, { schema })

Setting up drizzle-kit

Use the glob pattern (see example 3) to reference the generated table definitions.

import { defineConfig } from 'drizzle-kit'
export default defineConfig({
  // Using the default output path
  schema: './prisma/drizzle/*',
})

Generate .$defaultFn() Custom Default Initializer

Add /// drizzle.default <module>::<named-function-import> directive above the field definition to generate a custom default initializer.

NOTE: This will override any @default(...) attribute from the schema.

model User {
  /// drizzle.default @paralleldrive/cuid2::createId
  id     String @id
  ...
}

This will result to:

import { createId } from '@paralleldrive/cuid2'
...

export const users = pgTable('User', {
  id: text('id')
    .$defaultFn(() => createId())
    .primaryKey(),
  ...
})

Or with a custom code

model User {
  /// drizzle.default crypto::randomBytes `() => randomBytes(16).toString('hex')`
  salt      String?
  ...
}
import { randomBytes } from 'crypto'
...

export const users = pgTable('User', {
  salt: text('salt')
    .$defaultFn(() => randomBytes(16).toString('hex'))
    .notNull(),
  ...
})

Generate .$type<..>() Type Customization

Add /// drizzle.type <module>::<named-import> directive above the field definition.

model Wallet {
  /// drizzle.type viem::Address
  address     String?
  ...
}

This will result to:

import { Wallet } from 'viem'
...

export const wallets = pgTable('Wallet', {
  address: text('address').$type<Address>(),
  ...
})

Or with a relative import

model User {
  /// drizzle.type ../my-type::Email
  email     String?
  ...
}
import { Email } from '../my-type'
...

export const users = pgTable('User', {
  email: text('email').$type<Email>(),
  ...
})

Gotchas

Relative import paths need explicit file extensions in ECMAScript imports when '--moduleResolution' is 'node16' or 'nodenext'.

By default, the generator will try to find the closest tsconfig from the current working directory to determine the import style, whether to add .js or not. When there's no config found, it will use the common import (e.g. import { users } from './users').

You can explicitly set the moduleResolution option in the generator configuration.

Check also the discussion

SqliteError: NOT NULL constraint failed: <table-name>.id

Currently having @default(autoincrement()) only work for postgres and mysql.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.