当前位置: 首页 > 知识库问答 >
问题:

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

华俊贤
2023-03-14

我目前面临着将迁移与TypeORM和sqlite3数据库一起使用的问题。我希望在本地/测试/登台/生产环境之间尽可能多地使用奇偶校验,只在运行时使用将在docker compose文件中传递给docker的环境变量。我希望避免使用ormconfig。json文件和同步方法。

现在,在本地,我尝试使用一个dev配置文件来运行迁移,该文件似乎正在运行,但是迁移表不知何故是空的,并且从未创建过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

我的环境文件(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

包裹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个答案

羊舌自强
2023-03-14

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

当使用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

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

 类似资料:
  • 文档:https://eggjs.org/zh-cn/tutorials/sequelize.html sequelize 数据库迁移命令 命令 含义 sequelize db:migrate 运行迁移文件 sequelize db:migrate:status 列出所有迁移的状态 sequelize db:migrate:undo 隔离数据库:迁移:撤消 sequelize db:migrate

  • 主要内容:语法,实例,.dump 命令SQLite 的 sqlite3 命令被用来创建新的 SQLite 数据库。您不需要任何特殊的权限即可创建一个数据。 语法 sqlite3 命令的基本语法如下: 通常情况下,数据库名称在 RDBMS 内应该是唯一的。 另外我们也可以使用 .open 来建立新的数据库文件: 上面的命令创建了数据库文件 test.db,位于 sqlite3 命令同一目录下。 打开已存在数据库也是用 .open 命令,

  • 我有一个问题与我的Laravel迁移:( 当我运行php artisan migrate时,它会在外键上停止。 首次迁移 还有第二个 运行命令后,我出现以下错误: [Illumb\Database\QueryException] SQLSTATE[HY000]:一般错误:1005无法创建表gsb_larave.35; sql-176_b9(错误号:150“外键约束格式不正确”)(sql:alter

  • 欢迎任何输入或反馈。

  • 问题内容: 我正在尝试使用Genie代码创建数据库。但是,我在文档方面遇到了问题,所以我在这里问! 这可以认为是不直观的,因为我可以直接在命令行上运行sqlite并创建数据集。我这样做是出于教义的原因。 我想在python中模仿的代码是: 我已经学习了如何使用vala.doc,并找到了操作sqlite数据库的例程:Sqlite.Database。但是,我一直在编译时出错。 这是我重现该代码的程度:

  • 问题内容: 我正在使用http://code.google.com/p/sqlite- jdbc/wiki/Introduction中 的SQLite驱动程序。 上述文档中显示的示例显示了如何连接现有数据库。 在我的应用程序中,我需要创建一个SQLite数据库。怎么做?创建具有扩展名的文件是否足够?还有一个叫做的函数。如果可以,如何使用?我用谷歌搜索,没有人给出明确的答案。 问题答案: 如果文件不