Skip to content

Commit

Permalink
Merge branch 'main' into nikolasburk-patch-5
Browse files Browse the repository at this point in the history
  • Loading branch information
jharrell authored Mar 21, 2024
2 parents 8f95c4c + 0211b13 commit 657f8d7
Show file tree
Hide file tree
Showing 8 changed files with 115 additions and 69 deletions.
43 changes: 36 additions & 7 deletions content/200-orm/050-overview/500-databases/400-mysql.mdx
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
---
title: 'MySQL'
title: 'MySQL/MariaDB'
metaTitle: 'MySQL database connector'
metaDescription: 'This page explains how Prisma can connect to a MySQL database using the MySQL database connector.'
metaDescription: 'This page explains how Prisma can connect to a MySQL or MariaDB database using the MySQL database connector.'
tocDepth: 3
---

<TopBlock>

The MySQL data source connector connects Prisma ORM to a [MySQL](https://www.mysql.com/) database server.
The MySQL data source connector connects Prisma ORM to a [MySQL](https://www.mysql.com/) or [MariaDB](https://mariadb.org/) database server.

By default, the MySQL connector contains a database driver responsible for connecting to your database. You can use a [driver adapter](/orm/overview/databases/database-drivers#driver-adapters) (Preview) to connect to your database using a JavaScript database driver from Prisma Client.

Expand All @@ -26,7 +26,7 @@ datasource db {

The fields passed to the `datasource` block are:

- `provider`: Specifies the `mysql` data source connector.
- `provider`: Specifies the `mysql` data source connector, which is used both for MySQL and MariaDB.
- `url`: Specifies the [connection URL](#connection-url) for the MySQL database server. In this case, an [environment variable is used](/orm/prisma-schema/overview#accessing-environment-variables-from-the-schema) to provide the connection URL.

## Connection details
Expand All @@ -50,7 +50,7 @@ The following components make up the _base URL_ of your database, they are alway
| Name | Placeholder | Description |
| :------- | :---------- | :------------------------------------------------------------------------------------------------------------------ |
| Host | `HOST` | IP address/domain of your database server, e.g. `localhost` |
| Port | `PORT` | Port on which your database server is running, e.g. `5432` |
| Port | `PORT` | Port on which your database server is running, e.g. `5432` (default is `3306`, or no port when using Unix socket) |
| User | `USER` | Name of your database user, e.g. `janedoe` |
| Password | `PASSWORD` | Password for your database user |
| Database | `DATABASE` | Name of the [database](https://dev.mysql.com/doc/refman/8.0/en/creating-database.html) you want to use, e.g. `mydb` |
Expand Down Expand Up @@ -112,8 +112,8 @@ mysql://USER:PASSWORD@HOST:PORT/DATABASE?sslidentity=client-identity.p12&sslpass

### Connecting via sockets

To connect to your MySQL database via sockets, you must add a `socket` field as a _query parameter_ to the connection URL (instead of setting it as the `host` part of the URI).
The value of this parameter then must point to the directory that contains the socket, e.g.: `mysql://USER:POST@localhost/database?socket=/var/run/mysql/`
To connect to your MySQL/MariaDB database via a socket, you must add a `socket` field as a _query parameter_ to the connection URL (instead of setting it as the `host` part of the URI).
The value of this parameter then must point to the directory that contains the socket, e.g. on a default installation of MySQL/MariaDB on Ubuntu or Debian use: `mysql://USER:POST@localhost/database?socket=/run/mysqld/mysqld.sock`

Note that `localhost` is required, the value itself is ignored and can be anything.

Expand All @@ -139,6 +139,20 @@ The MySQL connector maps the [scalar types](/orm/prisma-schema/data-model/models
| `Json` | `JSON` | Supported in MySQL 5.7+ only |
| `Bytes` | `LONGBLOB` |

### Native type mapping from Prisma ORM to MariaDB

| Prisma ORM | MariaDB | Notes |
| ---------- | ---------------- | -------------------------------------------------- |
| `String` | `VARCHAR(191)` | |
| `Boolean` | `BOOLEAN` | In MariaDB `BOOLEAN` is a synonym for `TINYINT(1)` |
| `Int` | `INT` | |
| `BigInt` | `BIGINT` | |
| `Float` | `DOUBLE` | |
| `Decimal` | `DECIMAL(65,30)` | |
| `DateTime` | `DATETIME(3)` | |
| `Json` | `LONGTEXT | See https://mariadb.com/kb/en/json-data-type/ |
| `Bytes` | `LONGBLOB` | |

### Native type mappings

When introspecting a MySQL database, the database types are mapped to Prisma ORM according to the following table:
Expand Down Expand Up @@ -204,3 +218,18 @@ model Device {
## Engine

If you are using a version of MySQL where MyISAM is the default engine, you must specify `ENGINE = InnoDB;` when you create a table. If you introspect a database that uses a different engine, relations in the Prisma Schema are not created (or lost, if the relation already existed).

## Permissions

A fresh new installation of MySQL/MariaDB has by default only a `root` database user. Do not use `root` user in your Prisma configuration, but instead create a database and database user for each application. On most Linux hosts (e.g. Ubuntu) you can simply run this as the Linux `root` user (which automatically has database `root` access as well):

```
mysql -e "CREATE DATABASE IF NOT EXISTS $DB_PRISMA;"
mysql -e "GRANT ALL PRIVILEGES ON $DB_PRISMA.* TO $DB_USER@'%' IDENTIFIED BY '$DB_PASSWORD';"
```

The above is enough to run the `prisma db pull` and `prisma db push` commands. In order to also run `prisma migrate` commands these permissions need to be granted:

```
mysql -e "GRANT CREATE, DROP, REFERENCES, ALTER ON *.* TO $DB_USER@'%';"
```
Original file line number Diff line number Diff line change
Expand Up @@ -150,14 +150,14 @@ The following caveats apply:

The following table shows which referential action each database supports.

| Database | Cascade | Restrict | NoAction | SetNull | SetDefault |
| :---------- | :------ | :------- | :------- | :------ | :--------- |
| PostgreSQL | ✔️ | ✔️ | ✔️ | ✔️⌘ | ✔️ |
| MySQL | ✔️ | ✔️ | ✔️ | ✔️ | ❌ (✔️†) |
| SQLite | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| SQL Server | ✔️ | ❌‡ | ✔️ | ✔️ | ✔️ |
| CockroachDB | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| MongoDB†† | ✔️ | ✔️ | ✔️ | ✔️ ||
| Database | Cascade | Restrict | NoAction | SetNull | SetDefault |
| :------------ | :------ | :------- | :------- | :------ | :--------- |
| PostgreSQL | ✔️ | ✔️ | ✔️ | ✔️⌘ | ✔️ |
| MySQL/MariaDB | ✔️ | ✔️ | ✔️ | ✔️ | ❌ (✔️†) |
| SQLite | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| SQL Server | ✔️ | ❌‡ | ✔️ | ✔️ | ✔️ |
| CockroachDB | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| MongoDB†† | ✔️ | ✔️ | ✔️ | ✔️ ||

- † See [special cases for MySQL](#mysql).
- ⌘ See [special cases for PostgreSQL](#postgresql).
Expand All @@ -168,9 +168,9 @@ The following table shows which referential action each database supports.

Referential actions are part of the ANSI SQL standard. However, there are special cases where some relational databases diverge from the standard.

#### MySQL
#### MySQL/MariaDB

MySQL, and the underlying InnoDB storage engine, does not support `SetDefault`. The exact behavior depends on the database version:
MySQL/MariaDB, and the underlying InnoDB storage engine, does not support `SetDefault`. The exact behavior depends on the database version:

- In MySQL versions 8 and later, and MariaDB versions 10.5 and later, `SetDefault` effectively acts as an alias for `NoAction`. You can define tables using the `SET DEFAULT` referential action, but a foreign key constraint error is triggered at runtime.
- In MySQL versions 5.6 and later, and MariaDB versions before 10.5, attempting to create a table definition with the `SET DEFAULT` referential action fails with a syntax error.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ In order to create and delete the shadow database when using `migrate dev`, Pris
| Database | Database user requirements |
| -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| SQLite | No special requirements. |
| MySQL | Database user must have `CREATE, ALTER, DROP, REFERENCES ON *.*` privileges |
| MySQL/MariaDB | Database user must have `CREATE, ALTER, DROP, REFERENCES ON *.*` privileges |
| PostgreSQL | The user must be a super user or have `CREATEDB` privilege. See `CREATE ROLE` ([PostgreSQL official documentation](https://www.postgresql.org/docs/12/sql-createrole.html)) |
| Microsoft SQL Server | The user must be a site admin or have the `SERVER` securable. See the [official documentation](https://docs.microsoft.com/en-us/sql/relational-databases/security/permissions-database-engine?view=sql-server-ver15). |

Expand Down
5 changes: 3 additions & 2 deletions content/200-orm/500-reference/375-supported-databases.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,15 @@ An asterisk (\*) indicates that the version number is not relevant; either all v
| Database | Version |
| -------------------- | ------- |
| CockroachDB | 21.2.4+ |
| MariaDB | 10 |
| MariaDB | 10.0+ |
| MariaDB | 11.0+ |
| Microsoft SQL Server | 2017 |
| Microsoft SQL Server | 2019 |
| Microsoft SQL Server | 2022 |
| MongoDB | 4.2+ |
| MySQL | 5.6 |
| MySQL | 5.7 |
| MySQL | 8 |
| MySQL | 8.0 |
| PostgreSQL | 9.6 |
| PostgreSQL | 10 |
| PostgreSQL | 11 |
Expand Down
4 changes: 2 additions & 2 deletions content/300-accelerate/200-getting-started.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ To get started with Accelerate, you will need the following:

- A GitHub account.
- A project that uses [Prisma Client](/orm/prisma-client) `4.16.1` or higher. If your project is using interactive transactions, you need to use `5.1.1` or higher. (We always recommend using the latest version of Prisma.)
- A hosted PostgreSQL, MySQL, PlanetScale, CockroachDB, or MongoDB database.
- A hosted PostgreSQL, MySQL/MariaDB, PlanetScale, CockroachDB, or MongoDB database.

## 1. Enable Accelerate in a project

Expand Down Expand Up @@ -134,7 +134,7 @@ import { withAccelerate } from '@prisma/extension-accelerate'
const prisma = new PrismaClient().$extends(withAccelerate())
```

If you are going to deploy to an edge runtime (like Cloudflare Workers, Vercel Edge Functions, Deno Deploy, or Netlify Edge Functions), use our edge client instead:
If you are going to deploy to an edge runtime (like Cloudflare Workers, Vercel Edge Functions, Deno Deploy, or Supabase Edge Functions), use our edge client instead:

```ts
import { PrismaClient } from '@prisma/client/edge'
Expand Down
82 changes: 35 additions & 47 deletions content/400-pulse/200-getting-started.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -10,42 +10,41 @@ toc: true

## Prerequisites

You'll need the following to integrate Prisma Pulse into your application;
<Admonition type="info">

💡 Prisma Pulse currently supports PostgreSQL. We'd love to hear [which databases](https://tally.so/r/wLbb8G) you would like to see supported next.

</Admonition>

You'll need the following to integrate Pulse into your application;

- Prisma Data Platform workspace
- [Prisma Client](/orm/prisma-client) version `4.16.1` or higher and [`@prisma/extension-pulse`](https://www.npmjs.com/package/@prisma/extension-pulse) version `v1.0.1` or higher.
- A publicly accessible PostgreSQL (version 12+) database with [logical replication](https://www.postgresql.org/docs/current/logical-replication-quick-setup.html) enabled.
- Learn how to enable logical replication [here](/pulse/database-setup/general-database-instructions#enable-logical-replication)
- [Prisma Data Platform workspace](https://console.prisma.io)
- [Prisma Client](/orm/prisma-client) version `4.16.1` or higher and [`@prisma/extension-pulse`](https://www.npmjs.com/package/@prisma/extension-pulse) version `1.0.1` or higher.
- A publicly accessible PostgreSQL (version 12+) database with [logical replication](https://www.postgresql.org/docs/current/logical-replication-quick-setup.html) enabled. View our [setup guide](/pulse/database-setup/general-database-instructions#enable-logical-replication) on configuring logical replication for your database.

## 1. Enable Pulse

Access your Prisma Data Platform project and enable Prisma Pulse within an environment. We'll connect to your database and verify connectivity during setup.
Navigate to your Prisma Data Platform project, choose an environment, and enable Pulse. We'll connect to your database and verify connectivity during setup.

> Once enabled, you'll be prompted to create an API key that you'll use in your extended Prisma Client to authenticate requests. Store this API key in your application's `.env` file:
> Once enabled, you'll be prompted to generate an API key that you'll use in your extended Prisma Client to authenticate requests. Store this API key in your application's `.env` file:
>
> ```env file=.env
> PULSE_API_KEY="your_lengthy_secure_pulse_api_key"
> PULSE_API_KEY="your_secure_pulse_api_key"
> ```
## 2. Add Pulse to your application
<Admonition type="info">
With Pulse enabled, proceed with these steps to integrate Pulse into your application. You can also utilize our [example repository](https://github.com/prisma/pulse-starter) on GitHub as a reference guide.
We have created an [example repository](https://github.com/prisma/pulse-starter) on GitHub to help you get started using Prisma Pulse. If you would like to start there, you can do so.
</Admonition>
We'll be adding Prisma Pulse to the [hello-prisma](/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-postgresql) starter project from our documentation.
### 2.1. Install the Prisma Pulse Client extension
### 2.1. Install the Pulse Client extension
<Admonition>
💡 Prisma Pulse requires [Prisma Client](/orm/prisma-client) version `4.16.1` or higher and [`@prisma/extension-pulse`](https://www.npmjs.com/package/@prisma/extension-pulse) `v0.2.3` or higher
💡 Pulse requires [Prisma Client](/orm/prisma-client) version `4.16.1` or higher and [`@prisma/extension-pulse`](https://www.npmjs.com/package/@prisma/extension-pulse) version `1.0.1` or higher
</Admonition>
Install the latest version of Prisma Client and Pulse Prisma Client extension
Install the latest version of Prisma Client and the Pulse Client extension
```bash
npm install @prisma/client@latest @prisma/extension-pulse@latest
Expand All @@ -66,55 +65,44 @@ const prisma = new PrismaClient().$extends(

<Admonition type="info">

You should have received an **API key** when you added Prisma Pulse to your environment in the Platform Console.
You stored this API key in your .env file after [enabling Pulse](#1-enable-pulse). If needed, you can navigate to your respective project environment and generate a new API key.

</Admonition>

### 2.3. Create your first Prisma Pulse subscription
### 2.3. Create your first Pulse subscription

With the Prisma Pulse extension applied, you may now use Prisma Pulse's `subscribe()` method on any model defined in your Prisma Schema to subscribe to data change events.
With the Pulse extension applied, you can use Pulse's `subscribe()` method on any model defined in your Prisma Schema to subscribe to data change events.

In the example below, a subscription is made on a `user` table that listens for _any_ change event on that table:
In the below example, a subscription is made to a `notification` model that listens for _any_ change event on that table:

```ts
const prisma = new PrismaClient().$extends(withPulse({ apiKey: apiKey }))

async function main() {
const subscription = await prisma.user.subscribe({})

if (subscription instanceof Error) {
throw subscription
}

// Example: Set a timeout to the subscription after 60 seconds.
// Explicitly stopping the subscriptions and closing the connection is needed
// to not exhaust the limited number of subscriptions allowed per table.

setTimeout(() => {
console.log('Stopping the subscription.')
subscription.stop()
}, 60000)
const subscription = await prisma.notification.subscribe()

for await (const event of subscription) {
console.log('just received an event:', event)
console.log('just received a notification:', event)
}
}

main()
```

<Admonition type="info">

Refer to the [API Reference](/pulse/api-reference) section for more detail on the filtering options available to the `subscribe()` method.
All done! You've successfully added Pulse to your application. Explore next steps to learn more.

</Admonition>
## Next steps

## Database setup
[Navigate to the API section](/pulse/api-reference) to explore available filtering options for Pulse's `subscribe()` method.

<Admonition>

Prisma Pulse requires a publicly accessible PostgreSQL (version 12+) database with logical replication enabled.
```ts
const subscription = await prisma.notification.subscribe({
create: {
userId: 123, // subscribe to all notifications created for the user with ID 123
},
})
```

</Admonition>
## Need help?

To setup your database to work with Prisma Pulse, refer to the [database setup page](/pulse/database-setup).
Reach out to us in the `#help-and-questions` channel on our [Discord](https://pris.ly/discord), or connect with our community to see how others are using Pulse.
Loading

0 comments on commit 657f8d7

Please sign in to comment.