メインコンテンツへスキップ

MySQL/MariaDB

MySQLデータソースコネクタは、Prisma ORMをMySQLまたはMariaDBデータベースサーバーに接続します。

デフォルトでは、MySQLコネクタにはデータベースに接続するためのデータベースドライバーが含まれています。ドライバーアダプター(プレビュー)を使用すると、Prisma ClientからJavaScriptデータベースドライバーを使用してデータベースに接続できます。

MySQLデータベースサーバーに接続するには、Prismaスキーマdatasourceブロックを設定する必要があります。

schema.prisma
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}

datasourceブロックに渡されるフィールドは次のとおりです。

  • provider: MySQLとMariaDBの両方で使用されるmysqlデータソースコネクタを指定します。
  • url: MySQLデータベースサーバーの接続URLを指定します。この場合、接続URLを提供するために環境変数が使用されます

接続の詳細

接続URL

MySQL接続URLに必要なコンポーネントの概要を以下に示します。

Structure of the MySQL connection 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 ORMMySQL備考
StringVARCHAR(191)
BooleanBOOLEANMySQLでは、BOOLEANTINYINT(1)の同義語です。
IntINT
BigIntBIGINT
FloatDOUBLE
DecimalDECIMAL(65,30)
DateTimeDATETIME(3)現在、Prisma ORMはMySQLでゼロ日付(0000-00-00, 00:00:00)をサポートしていません。
JsonJSONMySQL 5.7+でのみサポート
BytesLONGBLOB

Prisma ORMからMariaDBへのネイティブ型マッピング

Prisma ORMMariaDB備考
StringVARCHAR(191)
BooleanBOOLEANMariaDBでは、BOOLEANTINYINT(1)の同義語です。
IntINT
BigIntBIGINT
FloatDOUBLE
DecimalDECIMAL(65,30)
DateTimeDATETIME(3)
JsonLONGTEXThttps://mariadb.com/kb/en/json-data-type/を参照
BytesLONGBLOB

ネイティブ型マッピング

MySQLデータベースをイントロスペクトする場合、データベース型は以下の表に従ってPrisma ORMにマッピングされます。

MySQLPrisma ORMサポートネイティブデータベース型属性備考
serialBigInt✔️@db.UnsignedBigInt @default(autoincrement())
bigintBigInt✔️@db.BigInt
bigint unsignedBigInt✔️@db.UnsignedBigInt
bitBytes✔️@db.Bit(x)bit(1)Booleanにマッピングされ、他のすべてのbit(x)Bytesにマッピングされます。
boolean | tinyint(1)Boolean✔️@db.TinyInt(1)
varbinaryBytes✔️@db.VarBinary
longblobBytes✔️@db.LongBlob
tinyblobBytes✔️@db.TinyBlob
mediumblobBytes✔️@db.MediumBlob
blobBytes✔️@db.Blob
binaryBytes✔️@db.Binary
dateDateTime✔️@db.Date
datetimeDateTime✔️@db.DateTime
timestampDateTime✔️@db.TimeStamp
timeDateTime✔️@db.Time
decimal(a,b)Decimal✔️@db.Decimal(x,y)
numeric(a,b)Decimal✔️@db.Decimal(x,y)
enumEnum✔️N/A
floatFloat✔️@db.Float
doubleFloat✔️@db.Double
smallintInt✔️@db.SmallInt
smallint unsignedInt✔️@db.UnsignedSmallInt
mediumintInt✔️@db.MediumInt
mediumint unsignedInt✔️@db.UnsignedMediumInt
intInt✔️@db.Int
int unsignedInt✔️@db.UnsignedInt
tinyintInt✔️@db.TinyInt(x)tinyint(1)Booleanにマッピングされ、他のすべてのtinyint(x)Intにマッピングされます。
tinyint unsignedInt✔️@db.UnsignedTinyInt(x)tinyint(1) unsignedBooleanマッピングされません
yearInt✔️@db.Year
jsonJson✔️@db.JsonMySQL 5.7+でのみサポート
charString✔️@db.Char(x)
varcharString✔️@db.VarChar(x)
tinytextString✔️@db.TinyText
textString✔️@db.Text
mediumtextString✔️@db.MediumText
longtextString✔️@db.LongText
set未サポート未対応
geometry未サポート未対応
point未サポート未対応
linestring未サポート未対応
polygon未サポート未対応
multipoint未サポート未対応
multilinestring未サポート未対応
multipolygon未サポート未対応
geometrycollection未サポート未対応

イントロスペクションは、まだサポートされていないネイティブデータベース型をUnsupportedフィールドとして追加します。

schema.prisma
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@'%';"
© . All rights reserved.