Prisma: 3.10.0 Release

Release date:
February 22, 2022
Previous version:
3.9.2 (released February 10, 2022)
Magnitude:
3,159 Diff Delta
Contributors:
9 total committers
Data confidence:
Commits:

73 Commits in this Release

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

Authored February 22, 2022
Authored February 15, 2022
Authored February 10, 2022
Authored February 18, 2022
Authored February 8, 2022
Authored February 8, 2022
Authored February 16, 2022
Authored February 17, 2022

Top Contributors in 3.10.0

Jolg42
millsp
aqrln
tomhoule
andyrichardson
prisma-bot
xnerhu
renovate-bot
jomasti

Directory Browser for 3.10.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 3.10.0 stable release πŸŽ‰

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

Major improvements and new features

We are working towards a stable release of MongoDB and are shipping lots of improvements. All the new features and changes in this release therefore only apply to the MongoDB connector. Take a closer look if you are using the Preview of MongoDB as some of the changes are breaking.

Embedded documents support is now in Preview

We're super excited to announce that Prisma version 3.10.0 supports reading and modifying embedded documents. Embedded documents will provide access to a new type keyword in your Prisma schema that you can use to define composite types.

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

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

model Product {
  id     String  @id @default(auto()) @map("_id") @db.ObjectId
  name   String
  photos Photo[]
}

type Photo {
  height Int
  width  Int
  url    String
}

Given the schema above, you can now read and write to the embedded photos array:

// Create a new product with an embedded list of photos
const product = await prisma.product.create({
  data: {
    name: "Forest Runners",
    // Create an embedded list of photos in the product
    photos: [
      { height: 100, width: 200, url: "1.jpg" },
      { height: 300, width: 400, url: "2.jpg" },
    ],
  },
})

Best of all, the query is entirely type-safe! This scratches the surface of what's possible with embedded documents. You can read further in our documentation.

If you run into anything, feel free to open an issue, and we’ll give you a hand!

Introspection of embedded documents is now enabled by default

We added Preview support for Introspection of embedded documents in version 3.4.0 and are now activating it for all users. Running prisma db pull against your MongoDB database will generate type definitions within your Prisma schema.

When introspecting your database, you can switch off the depth with --composite-type-depth=0, or limit it with, for example, --composite-type-depth=2.

Feel free to drop your feedback on the feature on GitHub.

@default(dbgenerated()) is now replaced with @default(auto())

The original purpose of dbgenerated is to support SQL expressions Prisma doesn’t understand yet. However, MongoDB doesn’t have a concept of default value expressions like SQL does. We took this opportunity to simplify how we handle the default values in MongoDB:

model Post {
-  id String @id @default(dbgenerated()) @map("_id") @db.ObjectId
+  id String @id @default(auto()) @map("_id") @db.ObjectId
}

Many-to-Many relations now require a references argument

Prisma version 3.10.0 now enforces all arguments in a MongoDB many-to-many relation. This means a @relation attribute must define fields and references arguments on both sides.

The fields argument must point to a scalar field in the same model, and this scalar field must be an array. The references arguments must point to a scalar field in the opposite model, and it must be a singular type of the same base type as the referencing array on the other side.

model Post {
  id           String     @id @map("_id") @default(auto()) @db.ObjectId
  category_ids String[]   @db.ObjectId
- categories   Category[] @relation(fields: [category_ids])
+ categories   Category[] @relation(fields: [category_ids], references: [id])
}

model Category {
  id       String   @id @map("_id") @default(auto()) @db.ObjectId
  post_ids String[] @db.ObjectId
- posts    Post[]   @relation(fields: [post_ids])
+ posts    Post[]   @relation(fields: [post_ids], references: [id])
}

@db.Array(ObjectId) is now updated to @db.ObjectId

We've adjusted the Prisma schema format for scalar lists with native types (like lists of Object IDs). This will likely affect those with many-to-many relationships in MongoDB. We made this change to align MongoDB with our existing SQL databases better:

model Post {
  id          String     @id @default(auto()) @map("_id") @db.ObjectId
- categoryIDs String[]   @db.Array(ObjectId)
+ categoryIDs String[]   @db.ObjectId
  categories  Category[] @relation(fields: [categoryIDs], references: [id])
}

model Category {
  id      String   @id @default(auto()) @map("_id") @db.ObjectId
- postIDs String[] @db.Array(ObjectId)
+ postIDs String[] @db.ObjectId
  posts   Post[]   @relation(fields: [postIDs], references: [id])
}

Fixes and improvements

Prisma Migrate

Prisma Client

Credits

Huge thanks to @andyrichardson, @xnerhu, @Josh-a-e, @dusandz, @hyochan, @cesconix, @benkroeger, @YassinEldeeb, @chenkie for helping!

πŸ“Ί Join us for another "What's new in Prisma" livestream

Learn about the latest release and other news from the Prisma community by joining us for another "What's new in Prisma" livestream.

The stream takes place on YouTube on Thursday, February 03 at 5 pm Berlin | 8 am San Francisco.