MySQL/MariaDB
MySQLデータソースコネクタは、Prisma ORMをMySQLまたはMariaDBデータベースサーバーに接続します。
デフォルトでは、MySQLコネクタにはデータベースに接続するためのデータベースドライバーが含まれています。ドライバーアダプター(プレビュー)を使用すると、Prisma ClientからJavaScriptデータベースドライバーを使用してデータベースに接続できます。
例
MySQLデータベースサーバーに接続するには、Prismaスキーマにdatasource
ブロックを設定する必要があります。
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
datasource
ブロックに渡されるフィールドは次のとおりです。
provider
: MySQLとMariaDBの両方で使用されるmysql
データソースコネクタを指定します。url
: MySQLデータベースサーバーの接続URLを指定します。この場合、接続URLを提供するために環境変数が使用されます。
接続の詳細
接続URL
MySQL接続URLに必要なコンポーネントの概要を以下に示します。
ベースURLとパス
大文字のプレースホルダー値を使用したベースURLとパスの構造の例を以下に示します。
mysql://USER:PASSWORD@HOST:PORT/DATABASE
以下のコンポーネントはデータベースのベースURLを構成し、常に必要です。
名前 | プレースホルダー | 説明 |
---|---|---|
ホスト | HOST | データベースサーバーのIPアドレス/ドメイン。例: localhost |
ポート | PORT | データベースサーバーが動作しているポート。例: 5432 (デフォルトは3306 、Unixソケットを使用する場合はポートなし) |
ユーザー | USER | データベースユーザー名。例: janedoe |
パスワード | PASSWORD | データベースユーザーのパスワード |
データベース | DATABASE | 使用するデータベースの名前。例: mydb |
特殊文字をパーセントエンコードする必要があります。
引数
接続URLは引数を受け取ることもできます。上記と同じ例で、3つの引数に対して大文字のプレースホルダー値を使用しています。
mysql://USER:PASSWORD@HOST:PORT/DATABASE?KEY1=VALUE&KEY2=VALUE&KEY3=VALUE
以下の引数を使用できます。
引数名 | 必須 | デフォルト | 説明 |
---|---|---|---|
connection_limit | いいえ | num_cpus * 2 + 1 | 接続プールの最大サイズ |
connect_timeout | いいえ | 5 | 新しい接続が開かれるまで待機する最大秒数。0 はタイムアウトなしを意味します。 |
pool_timeout | いいえ | 10 | プールから新しい接続を待機する最大秒数。0 はタイムアウトなしを意味します。 |
sslcert | いいえ | サーバー証明書へのパス。証明書のパスは./prisma フォルダーからの相対パスとして解決されます。 | |
sslidentity | いいえ | PKCS12証明書へのパス | |
sslpassword | いいえ | PKCS12ファイルを保護するために使用されたパスワード | |
sslaccept | いいえ | accept_invalid_certs | 証明書内の欠損値をチェックするかどうかを設定します。可能な値: accept_invalid_certs , strict |
socket | いいえ | 接続に使用するソケットを含むディレクトリを指します。 | |
socket_timeout | いいえ | 単一のクエリが終了するまで待機する秒数 |
例として、接続プールサイズを5
に設定し、クエリのタイムアウトを3
秒に設定したい場合、以下の引数を使用できます。
mysql://USER:PASSWORD@HOST:PORT/DATABASE?connection_limit=5&socket_timeout=3
SSL接続の構成
データベースサーバーがSSLを使用している場合、接続URLにさまざまなパラメータを追加できます。可能なパラメータの概要を以下に示します。
-
sslcert=<PATH>
: サーバー証明書へのパス。これは、データベースサーバーがクライアント証明書に署名するために使用するルート証明書です。証明書がシステムの信頼された証明書ストアに存在しない場合、これを提供する必要があります。Google Cloudの場合、これはおそらくserver-ca.pem
です。証明書のパスは./prisma
フォルダーからの相対パスとして解決されます。 -
sslidentity=<PATH>
: クライアント証明書と鍵から作成されたPKCS12証明書データベースへのパス。これは、クライアント鍵とクライアント証明書を使用して生成するPKCS12形式のSSL識別ファイルです。この2つのファイルを単一のファイルに結合し、パスワードで保護します(次のパラメータを参照)。このファイルは、以下のコマンド(openssl
を使用)でクライアント鍵とクライアント証明書を使用して作成できます。openssl pkcs12 -export -out client-identity.p12 -inkey client-key.pem -in client-cert.pem
-
sslpassword=<PASSWORD>
: PKCS12ファイルを保護するために使用されたパスワード。前のステップでリストされているopenssl
コマンドは、PKCS12ファイルの作成時にパスワードを要求します。ここでそのまったく同じパスワードを提供する必要があります。 -
sslaccept=(strict|accept_invalid_certs)
:strict
: 証明書に欠損値がある場合、エラーが発生します。Google Cloudの場合、特にデータベースにドメイン名がない場合、証明書にドメイン/IPアドレスが欠けている可能性があり、接続時にエラーを引き起こします。accept_invalid_certs
(デフォルト): このチェックをバイパスします。この設定のセキュリティ上の影響に注意してください。
データベース接続URLは次のようになります。
mysql://USER:PASSWORD@HOST:PORT/DATABASE?sslidentity=client-identity.p12&sslpassword=mypassword&sslcert=rootca.cert
ソケット経由での接続
ソケット経由でMySQL/MariaDBデータベースに接続するには、接続URLにクエリパラメータとしてsocket
フィールドを追加する必要があります(URIのhost
部分として設定するのではなく)。このパラメータの値は、ソケットを含むディレクトリを指す必要があります。例えば、UbuntuまたはDebianにデフォルトでインストールされたMySQL/MariaDBでは、mysql://USER:PASSWORD@HOST/DATABASE?socket=/run/mysqld/mysqld.sock
を使用します。
localhost
は必須ですが、その値自体は無視され、何でも構いません。
注: 詳細については、このGitHubの課題を参照してください。
MySQLとPrismaスキーマ間の型マッピング
MySQLコネクタは、Prisma ORMのデータモデルのスカラー型を、ネイティブカラム型に次のようにマッピングします。
または、Prisma ORMの型ごとに整理された型マッピングについては、Prismaスキーマのリファレンスを参照してください。
Prisma ORMからMySQLへのネイティブ型マッピング
Prisma ORM | MySQL | 備考 |
---|---|---|
String | VARCHAR(191) | |
Boolean | BOOLEAN | MySQLでは、BOOLEAN はTINYINT(1) の同義語です。 |
Int | INT | |
BigInt | BIGINT | |
Float | DOUBLE | |
Decimal | DECIMAL(65,30) | |
DateTime | DATETIME(3) | 現在、Prisma ORMはMySQLでゼロ日付(0000-00-00 , 00:00:00 )をサポートしていません。 |
Json | JSON | MySQL 5.7+でのみサポート |
Bytes | LONGBLOB |
Prisma ORMからMariaDBへのネイティブ型マッピング
Prisma ORM | MariaDB | 備考 |
---|---|---|
String | VARCHAR(191) | |
Boolean | BOOLEAN | MariaDBでは、BOOLEAN はTINYINT(1) の同義語です。 |
Int | INT | |
BigInt | BIGINT | |
Float | DOUBLE | |
Decimal | DECIMAL(65,30) | |
DateTime | DATETIME(3) | |
Json | LONGTEXT | https://mariadb.com/kb/en/json-data-type/を参照 |
Bytes | LONGBLOB |
ネイティブ型マッピング
MySQLデータベースをイントロスペクトする場合、データベース型は以下の表に従ってPrisma ORMにマッピングされます。
MySQL | Prisma ORM | サポート | ネイティブデータベース型属性 | 備考 |
---|---|---|---|---|
serial | BigInt | ✔️ | @db.UnsignedBigInt @default(autoincrement()) | |
bigint | BigInt | ✔️ | @db.BigInt | |
bigint unsigned | BigInt | ✔️ | @db.UnsignedBigInt | |
bit | Bytes | ✔️ | @db.Bit(x) | bit(1) はBoolean にマッピングされ、他のすべてのbit(x) はBytes にマッピングされます。 |
boolean | tinyint(1) | Boolean | ✔️ | @db.TinyInt(1) | |
varbinary | Bytes | ✔️ | @db.VarBinary | |
longblob | Bytes | ✔️ | @db.LongBlob | |
tinyblob | Bytes | ✔️ | @db.TinyBlob | |
mediumblob | Bytes | ✔️ | @db.MediumBlob | |
blob | Bytes | ✔️ | @db.Blob | |
binary | Bytes | ✔️ | @db.Binary | |
date | DateTime | ✔️ | @db.Date | |
datetime | DateTime | ✔️ | @db.DateTime | |
timestamp | DateTime | ✔️ | @db.TimeStamp | |
time | DateTime | ✔️ | @db.Time | |
decimal(a,b) | Decimal | ✔️ | @db.Decimal(x,y) | |
numeric(a,b) | Decimal | ✔️ | @db.Decimal(x,y) | |
enum | Enum | ✔️ | N/A | |
float | Float | ✔️ | @db.Float | |
double | Float | ✔️ | @db.Double | |
smallint | Int | ✔️ | @db.SmallInt | |
smallint unsigned | Int | ✔️ | @db.UnsignedSmallInt | |
mediumint | Int | ✔️ | @db.MediumInt | |
mediumint unsigned | Int | ✔️ | @db.UnsignedMediumInt | |
int | Int | ✔️ | @db.Int | |
int unsigned | Int | ✔️ | @db.UnsignedInt | |
tinyint | Int | ✔️ | @db.TinyInt(x) | tinyint(1) はBoolean にマッピングされ、他のすべてのtinyint(x) はInt にマッピングされます。 |
tinyint unsigned | Int | ✔️ | @db.UnsignedTinyInt(x) | tinyint(1) unsigned はBoolean にマッピングされません。 |
year | Int | ✔️ | @db.Year | |
json | Json | ✔️ | @db.Json | MySQL 5.7+でのみサポート |
char | String | ✔️ | @db.Char(x) | |
varchar | String | ✔️ | @db.VarChar(x) | |
tinytext | String | ✔️ | @db.TinyText | |
text | String | ✔️ | @db.Text | |
mediumtext | String | ✔️ | @db.MediumText | |
longtext | String | ✔️ | @db.LongText | |
set | 未サポート | 未対応 | ||
geometry | 未サポート | 未対応 | ||
point | 未サポート | 未対応 | ||
linestring | 未サポート | 未対応 | ||
polygon | 未サポート | 未対応 | ||
multipoint | 未サポート | 未対応 | ||
multilinestring | 未サポート | 未対応 | ||
multipolygon | 未サポート | 未対応 | ||
geometrycollection | 未サポート | 未対応 |
イントロスペクションは、まだサポートされていないネイティブデータベース型をUnsupported
フィールドとして追加します。
model Device {
id Int @id @default(autoincrement())
name String
data Unsupported("circle")
}
エンジン
MyISAMがデフォルトエンジンであるMySQLのバージョンを使用している場合、テーブルを作成する際にENGINE = InnoDB;
を指定する必要があります。異なるエンジンを使用するデータベースをイントロスペクトすると、Prismaスキーマ内のリレーションは作成されません(または、リレーションが既に存在する場合は失われます)。
権限
MySQL/MariaDBを新規インストールした場合、デフォルトではroot
データベースユーザーしか存在しません。Prisma設定でroot
ユーザーを使用せず、代わりに各アプリケーション用にデータベースとデータベースユーザーを作成してください。ほとんどのLinuxホスト(例: Ubuntu)では、これをLinuxのroot
ユーザーとして実行するだけで済みます(これにより、データベースのroot
アクセスも自動的に付与されます)。
mysql -e "CREATE DATABASE IF NOT EXISTS $DB_PRISMA;"
mysql -e "GRANT ALL PRIVILEGES ON $DB_PRISMA.* TO $DB_USER@'%' IDENTIFIED BY '$DB_PASSWORD';"
上記でprisma db pull
およびprisma db push
コマンドを実行するには十分です。prisma migrate
コマンドも実行するには、これらの権限を付与する必要があります。
mysql -e "GRANT CREATE, DROP, REFERENCES, ALTER ON *.* TO $DB_USER@'%';"