Prisma: 3.6.0 Release

Release date:
November 30, 2021
Previous version:
3.5.0 (released November 15, 2021)
Magnitude:
455 Diff Delta
Contributors:
8 total committers
Data confidence:
Commits:

42 Commits in this Release

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

Authored November 24, 2021
Authored November 17, 2021

Top Contributors in 3.6.0

aqrln
Akxe
renovate-bot
millsp
prisma-bot
pantharshit00
Jolg42
safareli

Directory Browser for 3.6.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.6.0 stable release 🎉

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

Major improvements & new features

Prisma Migrate

Full-text index support in MySQL and MongoDB (Preview)

In this version we introduce support for full-text indexes in the db pulldb push and migrate commands for MySQL and MongoDB databases as a Preview feature. This allows using them in the Prisma schema and prevents validation errors in some database schemas.

For now we do not enable the full-text search commands in the Prisma Client. They will be implemented separately, and the progress can be followed in the MongoDB and MySQL issues.

Add the preview feature fullTextIndex to the Prisma schema, after which the @@fulltext attribute is allowed in the Prisma schema:

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

model A {
  id      Int    @id
  title   String @db.VarChar(255)
  content String @db.Text

  @@fulltext([title, content])
}

Please note that it is mandatory to do db pull with the preview feature enabled before using Prisma Migrate on existing MySQL databases, so the index types can be converted and will not get overwritten in the next migration.

For more details check out our documentation.

Hash index support for PostgreSQL (Preview)

With the extendedIndexes preview feature, it is now possible to use Hash instead of the default BTree as the index algorithm on PostgreSQL databases. A hash index can be much faster for inserts, but it only supports equals operation in the database.

An example of using a hash index:

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

model A {
  id    Int @id
  value Int  

  @@index([value], type: Hash)
}

For more details check out our documentation.

VS Code extension now uses a Wasm module

Until this release, the language server powering the Prisma VS Code extension relied on logic from the Prisma engines in the form of a native binary. Downloading and running the native binary required a large amount of custom logic and led to problems due to network failures, operating system permissions and malicious code detection issues.

Starting with 3.6.0, the language server and the VS Code extension use logic compiled to WebAssembly and distributed through npm. There is no runtime binary download and no external process involved anymore. We expect this new distribution model to be more robust and hence provide a better experience for our users.

If you have any feedback, please leave an issue in the prisma/language-tools repository.

Prisma Client

Bytes can now be filtered with in and notIn

You can now use in and notIn operations on the Bytes type:

const audioTracks = raws.map(raw => {
  return Buffer.from(raw)
})

const result = await prisma.audio.find({
  where: {
    track: 
      in: audioTracks
    }
  }
})

Thanks @serejkaaa512 for your contribution!

Json fields now accept read-only types

This is a small quality-of-life improvement. You can now pass immutable values into Json fields. In the following example, audit is a Json field that accepts a read-only array:

const trail = [
  { event: "signup" },
  { event: "subscribe" },
  { event: "invite friend" }
] as const

await prisma.user.create({
  data: {
    audit: trail
  }
})

Learn more in this issue.

Reducing interactive transactions timeouts for binary engine

If you've spent some time using the new Interactive Transaction API with the binary engine, you may have encountered this timeout error:

Transaction API error: Transaction already closed: Transaction is no longer valid. Last state: 'Expired'.

This could happen if you had two concurrent requests modifying the same resource at the same time using the binary engine type.

It took us a while to track down the source of this error, but it turned out to be a low-level misconfiguration in our HTTP client. We disabled HTTP pipelining to fix this problem.

Fix notIn filters for large queries

This most likely didn't affect you, but if you ever tried using notIn with a large query, you may have received an incorrect result.

The query engine automatically breaks up large queries into smaller queries and intersects the results. Most of the time this works as expected but for certain queries like notIn, the intersection of results is incorrect.

We fixed this in 3.6.0. You can now use in and notIn operations on the Bytes type:

const denyList = [/* ... large list of user ids ... */]
const result = await prisma.user.findMany({
  where: {
    id: {
      notIn: denyList
    }
  }
})

This query will break up the query into chunks that your database can manage:

select * where User not in ($1,$2, ..., $5000)
select * where User not in ($1000,$1001, ..., $6000)

... and return the correct results. Learn more in this issue.

Fixes and improvements

Prisma Client

Prisma Migrate

Language tools (e.g. VS Code)

Prisma engines

Credits

Huge thanks to @Akxe, @safareli 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, December 02 at 5pm Berlin | 8am San Francisco.