我目前在使用带有 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"`);
}
}
$ 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
~``
答案 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
我希望这能帮助和我有同样问题的其他人。