Prisma: 2.15.0 Release

Release date:
January 20, 2021
Previous version:
2.14.0 (released January 4, 2021)
Magnitude:
4,585 Diff Delta
Contributors:
9 total committers
Data confidence:
Commits:

102 Commits in this Release

Ordered by the degree to which they evolved the repo in this version.

Authored January 11, 2021
Authored January 18, 2021
Authored January 13, 2021
Authored January 18, 2021
Authored January 15, 2021
Authored January 15, 2021
Authored January 13, 2021
Authored January 15, 2021
Authored January 8, 2021
Authored January 7, 2021
Authored January 18, 2021
Authored January 12, 2021
Authored January 13, 2021
Authored January 15, 2021

Top Contributors in 2.15.0

timsuchanek
Jolg42
williamluke4
nikolasburk
cyrus-za
renovate-bot
pantharshit00
mikebobadilla
emersonlaurentino

Directory Browser for 2.15.0

We haven't yet finished calculating and confirming the files and directories changed in this release. Please check back soon.

Release Notes Published

Today, we are excited to share the 2.15.0 stable release 🎉

🌟 Help us spread the word about Prisma by starring the repo or tweeting about the release.

Major improvements

Prisma Migrate now supports native database types (Preview)

In 2.11.0, we introduced support for native database types in the Prisma schema that allow you to map Prisma's scalar types to more specific types in the underlying database. However, these have not been compatible with the current Preview version of Prisma Migrate yet.

This release makes it possible to use Prisma Migrate with the native type annotations in your Prisma schema!

<details><summary>Expand for an example usage of Prisma Migrate with native types</summary>

Here's an example that uses several type annotations:

generator client {
  provider        = "prisma-client-js"
  previewFeatures = ["nativeTypes"]
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model Post {
  id        Int     @id @default(autoincrement()) @db.Integer
  published Boolean @default(false)
  content   String? @db.VarChar(1000)
  title     String  @db.VarChar(191)
  buffer    Bytes?
}

Running a migration using the prisma migrate command, the following SQL is created:

CREATE TABLE "Post" (
  "id" SERIAL,
  "published" BOOLEAN NOT NULL DEFAULT false,
  "content" VARCHAR(1000),
  "title" VARCHAR(191) NOT NULL,
  "buffer" BYTEA,
  PRIMARY KEY ("id")
);

</details>

Integrated database seeding (Preview)

A common requirement, especially for local development, is the ability to quickly seed your database with initial data. This is now possible with Prisma using the new prisma db seed command which is introduced in Preview in this release. Seeding is currently supported via scripts written in TypeScript, JavaScript, Go and Shell.

The command expects a file called seed with the respective file extension inside your main prisma directory.

  • JavaScript: prisma/seed.js
  • TypeScript: prisma/seed.ts
  • Go: prisma/seed.go
  • Shell: prisma/seed.sh

<details><summary>Expand for an example seeding workflow using TypeScript</summary>

For example, this prisma/seed.ts file could be invoked using the new command:

// prisma/seed.ts

import { PrismaClient } from '@prisma/client'

const prisma = new PrismaClient()

// A `main` function so that we can use async/await
async function main() {
  const newUser = await prisma.user.create({
    data: {
      email: "[email protected]"
    }
  })
  console.log(`new user created`, newUser.id)
}

main()
  .catch((e) => {
    console.error(e)
    process.exit(1)
  })
  .finally(async () => {
    await prisma.$disconnect()
  })

To execute the seeding, run the new command with the --preview-feature flag:

prisma db seed --preview-feature

</details>

Please provide feedback for the new prisma db seed command here.

Throw exceptions in findFirst and findUnique queries if no record is found

With the new rejectOnNotFound option, you can now tell Prisma Client to throw an exception when findFirst or findUnique does not find any records.

Here's an example:

const user = await client.user.findUnique({
  where: {
    id: 10,
  },
  rejectOnNotFound: true
})
// Throws "NotFoundError: No User found" if the 
// user with id = 10 does not exist.

If you omit rejectOnNotFound, these calls continue to return undefined.

Improved API for filtering arrays in PostgreSQL

We've added some new capabilities to your where condition for filtering arrays in PostgreSQL:

  • has: a value is contained within the array
  • hasEvery: all values are contained within the array
  • hasSome: at least one values is contained in the array
  • isEmpty: the array is empty

Here's an example:

model User {
  id    Int    @id
  roles Role[]
}

enum Role {
  ADMIN
  EDITOR
  READER
}
const admin = await prisma.user.findFirst({
  where: {
    id: 1,
    roles: {
      has: 'ADMIN'
    }
  }
})

Learn more about this feature from this GitHub comment.

More powerful counting of records using select

When using count queries, you can provide a number of options, e.g. for filtering. This release introduces the select option for count queries which lets you filter for non-null values of multiple fields in a single query.

Assume you have this User model with a number of optional fields:

model User {
  id        Int       @id @default(autoincrement()) @db.Integer
  createdAt DateTime  @default(now())
  name      String?
  email     String?
  birthday  DateTime?
}

You can send the following query to retrieve the count of records that contain non-null values for the respective field:

const userCounts = await prisma.user.count({
  select: {
    name: true,
    email: true,
    birthday: true
  } 
})

This will return an object with the following structure, where the value of each field indicates how many records in the database contain a value for it:

{
  name: 2,
  email: 0,
  birthday: 1
}

This is also works with aggregate and groupBy:

// new possibility:
const usersAggregation = await prisma.user.aggregate({
  count: { name: true }
})

// same for group by:
const groupedByName = await prisma.user.aggregate({
  by: ["name"],
  count: true
})

// or more fine-grained control over the fields to be counted
const groupedByNameCount = await prisma.user.aggregate({
  by: ["name"],
  count: { name: true, _all: true }
})

Modifying relations by directly setting foreign keys is now stable

In 2.11.0, we introduced the uncheckedScalarInputs preview flag which allowed you to modify relations by directly setting foreign keys in your queries (as opposed to using a nested write with the connect option).

Fire up that delete key because you can now remove this flag from your Prisma schema.

 generator client {
   provider        = "prisma-client-js"
-  previewFeatures = ["uncheckedScalarInputs"]
}

As a reminder, this allows you to set foreign keys directly:

// An example of the new API that directly sets the foreign key
const user = await prisma.profile.create({
  data: {
    bio: 'Hello World',
    userId: 42
  },
})

// If you prefer, you can still use the previous API via `connect`
const user = await prisma.profile.create({
  data: {
    bio: 'Hello World',
    user: {
      connect: { id: 42 }, // sets userId of Profile record
    },
  },
})

Read more about in the documentation on relation queries.

More improvements for Prisma Migrate

  • Prisma Migrate now detects when the migrations don’t match the configured provider on your datasource block, for example when the migrations have been created with sqlite but the provider is now set to postgresql. Prisma Migrate will now print a helpful error message in these cases.
  • prisma migrate reset can now be used in non-interactive environments (e.g. CI/CD) by passing the --force flag.
  • The new seeding functionality (see above) will be automatically triggered whenever prisma migrate reset is called to reset and repopulate the database in development. It's also triggered when the database is reset interactively after calling prisma migrate dev.

Dark mode for Prisma Studio 🌒 & more powerful filtering

As of this release, Prisma Studio can be used in dark mode! You can use the Settings icon in the top right corner to switch between light and dark mode.

We also included more powerful ways for you to filter the records of a table:

  • Filter by Json fields
  • Filter by the ID of a related model

Changes to the nativeTypes Preview feature

This version of introduces a few changes to the nativeTypes Preview feature:

  • Removed the Numeric alias for Decimal on PostgreSQL, MySQL and Microsoft SQL Server. Replace any Numeric types with Decimal when you upgrade.
  • Removed the Serial, SmallSerial, and BigSerial aliases for INT AUTOINCREMENT, SMALLINT AUTOINCREMENT, and BIGINT AUTOINCREMENT on PostgreSQL. You can use Int @default(autoincrement()), Int @db.SmallInt @default(autoincrement()) or Int @db.BigInt @default(autoincrement()) when you upgrade.
  • Renamed JSON to Json on MySQL.
  • Renamed Datetime to DateTime on MySQL.

Breaking changes

  • We've upgraded our RHEL base image from CentOS 6 to Amazon Linux 2. CentOS 6 reached end-of-life on November 30th, 2020. This may affect machines still running Amazon Linux 1. If you run into problems with this upgrade, please don't hesitate to reach out.
  • We've renamed the FindOneModelArgs and FindManyModelArgs type definitions to improve consistency. See this issue for more details.
  • Following the deprecation in 2.12.0, this release we've removed findOne and moved many of the Typescript types under the Prisma namespace.

Other

Transaction API for Prisma Client Go

Prisma Client Go now supports database transactions with a sparkly new Transaction API:

createUserA := client.User.CreateOne(
    db.User.ID.Set("c"),
    db.User.Email.Set("a"),
)
createUserB := client.User.CreateOne(
    db.User.ID.Set("d"),
    db.User.Email.Set("b"),
)
err := client.Prisma.Transaction(createUserA, createUserB).Exec(ctx)
if err != nil {
    return err
}

Learn more about Transaction in the reference. If you'd like to try out Prisma Client Go, check out the Quickstart for a gentle introduction.

SQL Server TLS Support on Mac

We now support secure connections between a Mac and SQL Server so your data is encrypted while in transit.

Fixes and improvements

Prisma Schema

Prisma Client

Prisma Migrate

Prisma Studio

Prisma Engines

Credits

Huge thanks to @qsona, @mikebobadilla, @cyrus-za for helping!