TypeORM:使用 SQLITE 运行迁移时不创建数据库表

时间:2021-07-29 22:45:06

标签: javascript node.js typescript express typeorm

我目前在使用带有 TypeORM 和 sqlite3 数据库的迁移时遇到问题。我希望通过在运行时仅使用将在 docker-compose 文件中传递给 docker 的环境变量,在本地/测试/暂存/生产环境之间获得尽可能多的奇偶校验。我想避免使用 ormconfig.json 文件和同步方法。

目前,在本地,我正在尝试使用开发配置文件运行迁移,该文件似乎有效,但迁移表以某种方式为空,并且从未创建过 URL 实体表。即使数据库或 dev.db 文件根本不存在或者是全新的,问题仍然存在:

$ sqlite3 src/db/storage/dev.db

文件结构:

backend
 ┣ env
 ┃ ┣ dev.env
 ┃ ┣ prod.env
 ┃ ┗ test.env
 ┣ scripts
 ┣ src
 ┃ ┣ db
 ┃ ┃ ┣ entity
 ┃ ┃ ┣ migration
 ┃ ┃ ┗ storage
 ┃ ┣ tests
 ┃ ┃ ┗ api.test.ts
 ┃ ┣ utils
 ┃ ┃ ┗ url.ts
 ┃ ┣ index.ts
 ┃ ┗ server.ts
 ┣ .babelrc
 ┣ .dockerignore
 ┣ .gitignore
 ┣ .prettierrc.json
 ┣ Dockerfile
 ┣ README.md
 ┣ jest.config.ts
 ┣ package.json
 ┣ tsconfig.json
 ┣ tsconfig.prod.json
 ┗ yarn.lock

我的 env 文件(dev.env):

TYPEORM_CONNECTION = better-sqlite3
TYPEORM_DATABASE = src/db/storage/dev.db
TYPEORM_ENTITIES = src/db/entity/*.ts 
TYPEORM_MIGRATIONS_DIR = src/db/migration/*.ts

TYPEORM_LOGGING = all

Package.json(脚本):

{
...
"scripts": {
   "typeorm": "ts-node --transpile-only ./node_modules/typeorm/cli.js",
   "typeorm:generate-migration": "yarn typeorm migration:generate",
   "typeorm:create-migration": "yarn typeorm migration:create",
   "typeorm:run-migration": "yarn typeorm migration:run",
   "typeorm:revert-migration": "yarn typeorm migration:revert",
   },
"dependencies": {
  ...
  "better-sqlite3": "^7.4.3",
  "reflect-metadata": "^0.1.13",
  "typeorm": "0.2.34"
  ...
}
...
}

我的实体:

import {EntitySchema} from "typeorm"

export interface Url {
  id: number
  url: string
}

export const UrlEntity = new EntitySchema<Url>({
  name: "Url",
  columns: {
    id: {
      type: Number,
      primary: true,
      generated: true
    },
    url: {
      type: String
    }
  }
})

我尝试过的:

  • 生成迁移文件
$ yarn typeorm:generate-migration -n CreateDatabase --config env/dev.env

迁移文件内容:

import {MigrationInterface, QueryRunner} from "typeorm";

export class CreateDatabase1627595908837 implements MigrationInterface {
    name = 'CreateDatabase1627595908837'

    public async up(queryRunner: QueryRunner): Promise<void> {
        await queryRunner.query(`CREATE TABLE "url" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "url" varchar NOT NULL)`);
    }

    public async down(queryRunner: QueryRunner): Promise<void> {
        await queryRunner.query(`DROP TABLE "url"`);
    }

}
  • 运行生成迁移表(不知何故是空的)并且不创建 url 表的迁移
$ yarn typeorm:run-migration --config ./env/dev.env 

命令输出:

$ query: SELECT * FROM "sqlite_master" WHERE "type" = 'table' AND "name" = 'migrations'
$ query: CREATE TABLE "migrations" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "timestamp" bigint NOT NULL, "name" varchar NOT NULL)
query: SELECT * FROM "migrations" "migrations" ORDER BY "id" DESC
$ No migrations are pending
~``

1 个答案:

答案 0 :(得分:0)

我想出了解决这个问题的办法。

当使用 ormconfig.json 和 typeorm CLI 时,我们需要明确订阅者、实体和迁移的目录,使用环境变量时也是如此。如果没有提供这些,或者在我的例子中只有其中一个,你最终会创建一个名为“/path/*.ts”的迁移文件夹,这是不正确的行为,即使这意味着它仍然会创建文件,但是不知道在哪里使用 cli 工具查找。

之前:

TYPEORM_CONNECTION = better-sqlite3
TYPEORM_DATABASE = src/db/storage/dev.db
TYPEORM_ENTITIES = src/db/entity/*.ts 
TYPEORM_MIGRATIONS_DIR = src/db/migration/*.ts
TYPEORM_LOGGING = all

之后:

TYPEORM_CONNECTION = "better-sqlite3"
TYPEORM_DATABASE = src/db/storage/dev.db
TYPEORM_ENTITIES = src/db/entity/*.ts
TYPEORM_MIGRATIONS = src/db/migrations/*.ts
TYPEORM_ENTITIES_DIR = src/db/entity
TYPEORM_MIGRATIONS_DIR = src/db/migrations
TYPEORM_LOGGING = all

运行迁移后,这是输出:

$ yarn typeorm migration:run --config ./env/dev.env

$ ts-node --transpile-only ./node_modules/typeorm/cli.js migration:run --config ./env/dev.env

query: SELECT * FROM "sqlite_master" WHERE "type" = 'table' AND "name" = 'migrations'

query: CREATE TABLE "migrations" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "timestamp" bigint NOT NULL, "name" varchar NOT NULL)

query: SELECT * FROM "migrations" "migrations" ORDER BY "id" DESC

0 migrations are already loaded in the database.
1 migrations were found in the source code.
1 migrations are new migrations that needs to be executed.

query: BEGIN TRANSACTION

query: CREATE TABLE "url" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "url" varchar NOT NULL)

query: INSERT INTO "migrations"("timestamp", "name") VALUES (?, ?) -- PARAMETERS: [1627601766574,"CreateDatabase1627601766574"]

Migration CreateDatabase1627601766574 has been executed successfully.
query: COMMIT

我希望这能帮助和我有同样问题的其他人。