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に投稿されまくっていたが(参考文献参照)どれも上手くいかなかった.
原因は,autoSchemaSync
やsynchronize
がtrueになってしまっていることだ.
falseにすると,実用に足らないのでなんとかfalseにせずに解決したかった.
そこでmigrationをすれば,状態が分かると思いtypeorm migration:generate -n UserMigration
,typeorm 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によってはどんな状況でも同様のエラーが起きていたようだが,今は,開発環境を整えて挙げればエラーを回避出来る状態まで来ているはず.多分.
参考文献
- Can’t create SQLite migrations (DriverPackageNotInstalledError) #5176
https://github.com/typeorm/typeorm/issues/5176 - Foreign key constraint failed — after inserting item into child table and relaunching application #1332
https://github.com/typeorm/typeorm/issues/1332 - Error: SQLITE_CONSTRAINT: NOT NULL constraint failed: files.id #919
https://github.com/typeorm/typeorm/issues/919 - SQLITE_CONSTRAINT: NOT NULL constraint failed: temporary_*#1880
https://github.com/typeorm/typeorm/issues/1880 - Cannot create a new connection named “default”, because connection with such name already exist and it now has an active connection session. #592
https://github.com/typeorm/typeorm/issues/592 - SQLite OneToMany ManyToOne synchronize: true Error: SQLITE_CONSTRAINT #2576
https://github.com/typeorm/typeorm/issues/2576 - Using CLI, typeorm
https://github.com/typeorm/typeorm/blob/master/docs/using-cli.md#drop-database-schema - 【入門】CLIでプロジェクト構築して使い方を確認
https://www.wakuwakubank.com/posts/725-typeorm-cli-init/
コメント
[…] で解決.[typeORM] NOT NULL constraint Failedなどのsynchronize回りのエラーの解決方法. […]