我目前面临着将迁移与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"`);
}
}
$ 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
~``
我想出了这个问题的解决办法。
当使用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。但是,我一直在编译时出错。 这是我重现该代码的程度:
我正在使用Flyway更新DB模式。当前,模式的最新版本是3(最新的迁移文件名为)。 我是否正确理解了参数,还是遗漏了什么? 注意:我知道自Spring Boot2以来,参数名称空间已经更改为,但我使用的是Spring Boot1,所以这不是问题。