たかぎとねこの忘備録

プログラミングに関する忘備録を自分用に残しときます。マサカリ怖い。

NestJSでのデータベースをSQLiteからMySQLに乗り換えた話

*.controller.spec.ts*.e2e-spec.tsでテストを行う際に、あえてサービスに対してモックを行わず、Prismaを通してローカルに置いてあるSQLiteを使用するようにしていた。

ところが、テストの数が多くなってくるとConnectorErrorが発生し始めた。

Invalid `this.prisma.user.delete()` invocation in
...
53 async remove(where: Prisma.UserWhereUniqueInput): Promise<User> {
→  54   const deletedUser = await this.prisma.user.delete(
Error occurred during query execution:
    ConnectorError(ConnectorError { user_facing_error: None, kind: ConnectionError(Timed out during query execution.) })

DATABASE_URL環境変数を設定する際にbusy_timeoutパラメーターやconnection_limitパラメーターを使用してみたがうまくいかなかった。

DATABASE_URL="file:./dev.db?busy_timeout=100000&connection_limit=1&socket_timeout=100000"

github.com

なので、DockerでMySQLコンテナを立ち上げてそれに接続するようにした。

僕の環境はM1 Proなので通常のmysql:8.0イメージを使わず、arcm64v8/mysql:8.0-oracleイメージを利用している。

// docker-compose.yml 

version: "3.7"
services:
  mysql:
    image: arm64v8/mysql:8.0-oracle
    restart: always
    environment:
      MYSQL_ROOT_HOST: "%"
      MYSQL_ROOT_PASSWORD: "root"
      MYSQL_DATABASE: "example-database"
      MYSQL_USER: "mysql"
      MYSQL_PASSWORD: "mysql"
    ports:
      - "3306:3306"
    volumes:
      - ./mysql-data:/var/lib/mysql

docker-compose up -dを実行して、コンテナを立ち上げる。そして、環境変数DATABASE_URLを設定する。

DATABASE_URL="mysql://root:root@localhost:3321/example-database"

schema.prismaprovidersqliteに設定している場合はmysqlに変更する。

generator client {
  provider = "prisma-client-js"
}

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

あとはnpx prisma db pushを実行して完了。

環境を整えてすべてのテストを実行してみると、warn(prisma-client) There are already 10 instances of Prisma Client actively running.は表示されたものの、テストは無事成功した。