[typeORM] NOT NULL constraint Failedなどのsynchronize回りのエラーの解決方法

web application開発でバックエンドでのデータベースとのやり取りにtypeORMを用いた.データベースにはsqliteを用いた.しかしながら,データベースを立ち上げたは良いが一度立ち上げると二度目に立ち上げる際にエラーが吐き出される.それは以下ものが挙げられる.

  • Error: SQLITE_CONSTRAINT: FOREIGN KEY constraint failed
  • Error: SQLITE_CONSTRAINT: NOT NULL constraint failed
  • SQLITE_CONSTRAINT: NOT NULL constraint failed: temporary_*


同様のエラーは,かなりtypeormのissuesに投稿されまくっていたが(参考文献参照)どれも上手くいかなかった.
原因は,autoSchemaSyncsynchronize がtrueになってしまっていることだ.
falseにすると,実用に足らないのでなんとかfalseにせずに解決したかった. 

そこでmigrationをすれば,状態が分かると思いtypeorm migration:generate -n UserMigrationtypeorm migration:run をしてみると,migrationが通常ならば,

import {MigrationInterface, QueryRunner} from "typeorm";

export class Test1599199531504 implements MigrationInterface {
    name = 'Test1599199531504'

    public async up(queryRunner: QueryRunner): Promise {
        await queryRunner.query("CREATE TABLE `user` (`id` int NOT NULL AUTO_INCREMENT, `firstName` varchar(255) NOT NULL, `lastName` varchar(255) NOT NULL, `age` int NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB");
    }

    public async down(queryRunner: QueryRunner): Promise {
        await queryRunner.query("DROP TABLE `user`");
    }

}

のように一行づつぐらいしか出ないはずが大量の行が発生.

これは,もしや古いファイルが残っているだけなのではないかと睨んだ.つまり,tsc コマンで.tsをコンパイルするが,.tsが修正されても.jsが残っており,.jsを参照し続けてしまうことが判明した.

僕のormconfig.jsの設定は以下の通りだ.(typescriptで使用するために,jsで設定が行われている.)

module.exports = {
   "type": "sqlite",
   "database": "db/app.sqlite",
   "synchronize": true, 
   "logging": false,
   "entities": [
      __dirname + "/dist/api/entity/**/*.js"
   ],
   "migrations": [
      __dirname + "/dist/api/migration/**/*.js"
   ],
   "subscribers": [
      __dirname + "/dist/api/subscriber/**/*.js"
   ],
   "cli": {
      "entitiesDir": "/api/entity",
      "migrationsDir": "/api/migration",
      "subscribersDir": "/api/subscriber"
   }
}

そこで,tsc コマンドを実行する前に,tscで生成されるtypeorm関連のファイルを毎度消去することにした.
yarn start に以下のコードを登録.

"start": "rm -rf /dist/api && tsc && node dist/index.js",

するとエラーは発生しなくなった.

ここを乗り越えたらtypeORMで快適に開発を勧められる!

———-雑感(`・ω・´)———-
同じ様なエラーが大量にissuesに上がり続けているのを見るのは少し楽しかった.versionによってはどんな状況でも同様のエラーが起きていたようだが,今は,開発環境を整えて挙げればエラーを回避出来る状態まで来ているはず.多分.

参考文献

コメント

  1. […] で解決.[typeORM] NOT NULL constraint Failedなどのsynchronize回りのエラーの解決方法. […]

タイトルとURLをコピーしました