Today, we are excited to share the `2.23.0` stable release 🎉
🌟 **Help us spread the word about Prisma by starring the repo or [tweeting](https://twitter.com/intent/tweet?text=Check%20out%20the%20latest%20prisma%20release%`0v2.23.0`%20%F0%9F%9A%80%0D%0A%0D%0Ahttps://github.com/prisma/prisma/releases/tag/2.23.0) about the release.** 🌟
Major improvements & new features
JSON Filtering is now in Preview
Starting today, you can now filter rows by data inside a `Json` type. JSON filtering support is available in PostgreSQL and MySQL. You can try it today by adding the `filterJson` preview flag to your `generator` block. This has been one of our most popular feature requests, so we're very excited to be getting it into your hands!
To get an idea of how JSON filtering works, let's see how you might query application logs stored in your database. Given the following Prisma schema:
prisma
generator client {
provider = "prisma-client-js"
previewFeatures = ["filterJson"]
}
model Log {
id Int id default(autoincrement())
level Level
message String
meta Json
}
enum Level {
INFO
WARN
ERROR
}
And the following records in your PostgreSQL database:
| id | level | message | meta |
| --- | ----- | ---------------------------------- | ------------------------------------------------------------ |
| 2 | `INFO` | application listening on port 3000 | `{"host": "bob"}` |
| 3 | `INFO` | upgrading account | `{"host": "alice", "request_id": 10}` |
| 4 | `INFO` | charging customer | `{"host": "alice", "amount": 20, "request_id": 10}` |
| 5 | `ERROR` | credit card expired | `{"host": "alice", "amount": 20, "request_id": 10}` |
| 6 | `INFO` | signing up | `{"host": "bob", "request_id": 1}` |
| 7 | `INFO` | application listening on port 3000 | `{"host": "alice"}` |
| 8 | `INFO` | signed up | `{"host": "bob", "email": "jamesgmail.com", "request_id": 1}` |
We can now filter logs by the data inside the `meta` field. Let's query by the `request_id` inside the `meta` field to track the journey that led up to the error.
We can write the following query:
js
const logs = await prisma.log.findMany({
where: {
meta: {
// path looks for the request_id key inside meta
path: ["request_id"],
// and we select rows whose request_id is 10
equals: 10,
},
},
orderBy: {
id: "asc",
},
});
Giving us the entire journey of this person's request:
js
[
{
id: 3,
level: 'INFO',
message: 'upgrading account',
meta: { host: 'alice', request_id: 10 }
},
{
id: 4,
level: 'INFO',
message: 'charging customer',
meta: { host: 'alice', amount: 20, request_id: 10 }
},
{
id: 5,
level: 'ERROR',
message: 'credit card expired',
meta: { host: 'alice', amount: 20, request_id: 10 }
}
]
Please note that the `path` syntax varies depending on the database. We pass the `path` query directly to the database, so there will be syntactical differences.
For example, querying by key in Postgres is `request_id`, while in MySQL it would be `$.request_id`. Please consult your database's documentation to learn more.
If you run into any questions or have any feedback, we're available in [this issue](https://github.com/prisma/prisma/issues/7135).
📚 **Documentation**: [Working with Json fields](https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields)
Improvement for `prisma db seed`
In previous versions, a _seed file_ could only be executed as a _script_. `prisma db seed` was simply executing the script by either calling `node ./prisma/seed.js` for JavaScript or `ts-node ./prisma/seed.ts` for TypeScript.
Now, you can directly export a function that Prisma executes on your behalf. Here's the rules that describe the new behavior: Prisma checks if the seed file has ...
- ... an exported function named `seed` and executes it
- ... an exported function (via a _default_ export) and executes it
If there's no function exported as `seed` or via a _default_ export, the behaviour of `prisma db seed` is exactly the same as before, meaning it will simply be executed as a script file.
Breaking changes
Options in `groupBy` queries are now prefixed with an underscore
The options in `groupBy` are now prefixed with an underscore, for example:
diff
// API
const result = await prisma.user.groupBy({
by: ['name'],
- count: true,
+ _count: true,
})
Here's an overview of the exact changes of each option:
| Before `2.23.0` | `2.23.0` and later |
| --------------- | ------------------ |
| `count` | `_count` |
| `max` | `_max` |
| `min` | `_min` |
| `avg` | `_avg` |
| `sum` | `_sum` |
Note that this also changes the names of the fields in the objects that are returned by Prisma Client. For example, in the above case you now access the returned _count_ value like so:
diff
- console.log(result.count)
+ console.log(result._count)
We made this change to avoid clashes with user-defined fields. You can learn more about the problem in [these issues](https://github.com/prisma/prisma/search?q=count&type=issues).
We're sorry for the inconvenience! If you have any questions or need any help, please reach out [in this discussion](https://github.com/prisma/prisma/discussions/7110).
Deprecations
Deprecating options in `aggregate` queries
With the changes to `groupBy` discussed above and recent features like [orderBy an aggregate](https://www.prisma.io/docs/concepts/components/prisma-client/aggregation-grouping-summarizing#order-by-aggregate-group-preview), we took this opportunity to unify `min`, `max`, `avg`, `sum` and `count` keywords across Prisma Client queries.
diff
const result = await prisma.user.aggregate({
- avg: {
+ _avg: {
age: true,
},
})
- result.avg
+ result._avg
Similar to `groupBy`, this is the case for all of our aggregations:
| Before `2.23.0` | `2.23.0` and later |
| --------------- | ------------------ |
| `count` | `_count` |
| `max` | `_max` |
| `min` | `_min` |
| `avg` | `_avg` |
| `sum` | `_sum` |
**This is not a breaking change.** The aggregate queries you wrote prior to `2.23.0` will continue to work as expected. We ask that you make adjustments when you can to future-proof your application.
If you have any questions or need any help, please reach out [in this discussion](https://github.com/prisma/prisma/discussions/7110).
Fixes and improvements
Prisma Migrate
- [Changing foreign key column from optional to required causes migration error](https://github.com/prisma/prisma/issues/4602)
- [Failed Migration Log file output moved to ~/prisma folder](https://github.com/prisma/prisma/issues/4715)
- [prisma db push creates new prisma client inside of ./node_modules/prisma/client](https://github.com/prisma/prisma/issues/4885)
- [Do not force seed to be script](https://github.com/prisma/prisma/issues/5624)
- [Prisma migrate dev prompts for migration name when running after --create-only (2.19)](https://github.com/prisma/prisma/issues/6210)
- ["Name of migration" input unclear when migrations exist](https://github.com/prisma/prisma/issues/6582)
- [Error: Error in migration engine. Reason: [C:\Users\runneradmin\.cargo\git\checkouts\quaint-9f01e008b9a89c14\8196f13\src\connector\result_set\result_row.rs:59:64] index out of bounds: the len is 1 but the index is 10 ](https://github.com/prisma/prisma/issues/6736)
- [Error: [libs/sql-schema-describer/src/sqlite.rs:452:76] get name ](https://github.com/prisma/prisma/issues/6740)
- [Prisma migrate repeatedly generates default value for `dbgenerated("gen_random_uuid()::TEXT")`](https://github.com/prisma/prisma/issues/6794)
- [Error: [libs/datamodel/core/src/transform/ast_to_dml/lift.rs:387:73] called `Option::unwrap()` on a `None` value ](https://github.com/prisma/prisma/issues/6860)
- [Error: [libs/datamodel/connectors/dml/src/model.rs:161:64] Could not find relation field nodes on model nodes. ](https://github.com/prisma/prisma/issues/6861)
- [Indexing error when run migration again](https://github.com/prisma/prisma/issues/6873)
- [Improve diagnostics for timeouts in Migrate](https://github.com/prisma/prisma/issues/6920)
- [Prisma Migrate with SQL Server errors with `Error: Invalid data source URL, see https://www.prisma.io/docs/reference/database-reference/connection-urls` in 2.22.0](https://github.com/prisma/prisma/issues/6984)
Prisma Client
- [Prisma Client hangs and eventually panics when there is no MongoDB server to connect to](https://github.com/prisma/prisma/issues/6431)
- [Where filter not working with JSON.not with another condition](https://github.com/prisma/prisma/issues/6755)
- [Ordering By Relation count incorrectly orders 0 count](https://github.com/prisma/prisma/issues/6824)
- [Incorrect AggregateOutputType DMMF definition of array fields](https://github.com/prisma/prisma/issues/6835)
- [[Feature Request] Ability to use RETURNING in SQLite - Bump SQLite Version up to 3.35.0](https://github.com/prisma/prisma/issues/6876)
- [PANIC in query-engine/core/src/query_graph_builder/read/aggregations/mod.rs:24:18Expected at least oe selection for aggregate](https://github.com/prisma/prisma/issues/7052)
Prisma Studio
- [Prisma studio showed no data](https://github.com/prisma/studio/issues/617)
- [Fatal Error](https://github.com/prisma/studio/issues/636)
- [Prisma Studio not showing data from database upon launch](https://github.com/prisma/studio/issues/649)
- [Prisma Studio not working with Safari 14.0.3](https://github.com/prisma/studio/issues/664)
- [npx prisma studio fails to start up on the browser ](https://github.com/prisma/studio/issues/666)
- [Refreshing prisma studio is stuck on loading screen](https://github.com/prisma/studio/issues/675)
- [Prisma studio not showing the data from the db](https://github.com/prisma/studio/issues/681)
Prisma Engines
- [Testdb setup ignores Migrate errors](https://github.com/prisma/prisma-engines/issues/1834)
- [Found bug in migration checksum](https://github.com/prisma/prisma-engines/issues/1887)
Credits
Huge thanks to Sytten, schiller-manuel, mongolyy, paularah, Iamshankhadeep, meeq 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"](https://www.youtube.com/watch?v=lwl0IOj2PxM) livestream.
The stream takes place [on Youtube](https://www.youtube.com/watch?v=lwl0IOj2PxM) on **Thursday, May 20** at **5pm Berlin | 8am San Francisco**.
🌎 Prisma Day is coming
Save the date for [Prisma Day 2021](https://www.prisma.io/day) and join us for two days of talks and workshops by the most exciting members of the Prisma community.
- June 29th: Workshops
- June 30th: Talks ([Submit a talk proposal](https://prisma103696.typeform.com/to/Vlfg1HE2))
We look forward to seeing you there!