解決方法
解決策は4つあります。4つ目が本命です。
1. synchronizeをやめる
これでエラーはなくなるけど、エンティティが同期されなくなるので不便。。。
{
"synchronize": true
}
2. カラムをnullableにする
これも根本的な解決じゃない。。。
@Column({ nullable: true })
name: string;
3. SQLiteを使わない
身も蓋もないですが、ありだと思います。
4. トランスパイルする
私の環境では、ts-node
を使わないようにすると、エラーが解決されました。
以下の手順を行ってください。
STEP 1
tsconfig.json
のCompilerOptionsに"skipLibCheck": true
を指定する。
これは、STEP3のtsc
コマンド実行時にエラーを表示させないためです。
基本的に推奨されるオプションではないので、エラーが出なかったら消してください。
{
"compilerOptions": {
"lib": [
"es5",
"es6"
],
"module": "commonjs",
"moduleResolution": "node",
"outDir": "./build",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"sourceMap": true,
"skipLibCheck": true
}
}
STEP 2
ormconfig.json
を以下のように書き換えます。
これは、トランスパイルしたJavaScriptを実行するためにパスを変更しています。
-
/src
→/build
-
.ts
→.js
{
"type": "sqlite",
"database": "database.sqlite",
"synchronize": true,
"logging": false,
"entities": [
"build/entity/**/*.js"
],
"migrations": [
"build/migration/**/*.js"
],
"subscribers": [
"build/subscriber/**/*.js"
],
"cli": {
"entitiesDir": "build/entity",
"migrationsDir": "build/migration",
"subscribersDir": "build/subscriber"
}
}
STEP 3
tsc
でトランスパイルします。
$ tsc
すると、build
ディレクトリに.js
ファイルがたくさん書き出されるはずです。
実行できないときは、
typescript
をグローバルにインストールしてください。
$ npm i -g typescript
#### STEP 4
`node`でトランスパイルしたJavaScriptファイルを実行します。
```sh
$ node build/index.js
これでエラーが出なければOKです。
STEP 5
毎回コマンドを打ち込むのは大変なので、package.json
に書き加えてスクリプトにします。
{
...
"scripts": {
"start": "tsc && node build/index.js",
}
}
最初は実行できたけど、後でエラーになった場合
自分は遭遇してませんが、前の実行で出力したJavaScriptファイルが残っていると、エラーになる場合があるようです。その場合、以下のようなコマンドで実行前にbuild
ディレクトリを削除してください。
$ rm -r build && tsc && node dist/index.js
参考: [typeORM] NOT NULL constraint Failedなどのsynchronize回りのエラーの解決方法
発生したエラーの詳細
$ ts-node src/index.ts
QueryFailedError: SQLITE_CONSTRAINT: NOT NULL constraint failed: temporary_user.name
at new QueryFailedError (/Users/src/error/QueryFailedError.ts:11:9)
at Statement.handler (/Users/src/driver/sqlite/SqliteQueryRunner.ts:79:26) {
errno: 19,
code: 'SQLITE_CONSTRAINT',
query: 'INSERT INTO "temporary_user"("id") SELECT "id" FROM "user"',
parameters: []
}