我想用 mikro-orm 插入,但它找不到我的 table :c (TableNotFoundException)
I want to insert with mikro-orm, but it dont find my table :c (TableNotFoundException)
所以
控制台:
yarn dev
yarn run v1.22.10
$ nodemon dist/index.js
[nodemon] 2.0.7
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node dist/index.js`
[discovery] ORM entity discovery started, using ReflectMetadataProvider
[discovery] - processing entity Post
[discovery] - entity discovery finished, found 1 entities, took 21 ms
[info] MikroORM successfully connected to database postgres on postgresql://postgres:*****@127.0.0.1:5432
[query] begin
[query] insert into "post" ("created_at", "title", "updated_at") values ('2021-04-05T21:04:23.126Z', 'my first post', '2021-04-05T21:04:23.126Z') returning "_id" [took 12 ms]
[query] rollback
TableNotFoundException: insert into "post" ("created_at", "title", "updated_at") values ('2021-04-05T21:04:23.126Z', 'my first post', '2021-04-05T21:04:23.126Z') returning "_id" - relation "post" does not exist
at PostgreSqlExceptionConverter.convertException (P:\.Projektek\lireddit-server\node_modules\@mikro-orm\postgresql\PostgreSqlExceptionConverter.js:36:24)
at PostgreSqlDriver.convertException (P:\.Projektek\lireddit-server\node_modules\@mikro-orm\core\drivers\DatabaseDriver.js:194:54)
at P:\.Projektek\lireddit-server\node_modules\@mikro-orm\core\drivers\DatabaseDriver.js:198:24
at processTicksAndRejections (internal/process/task_queues.js:93:5)
at async PostgreSqlDriver.nativeInsert (P:\.Projektek\lireddit-server\node_modules\@mikro-orm\knex\AbstractSqlDriver.js:150:21)
at async ChangeSetPersister.persistNewEntity (P:\.Projektek\lireddit-server\node_modules\@mikro-orm\core\unit-of-work\ChangeSetPersister.js:55:21)
at async ChangeSetPersister.executeInserts (P:\.Projektek\lireddit-server\node_modules\@mikro-orm\core\unit-of-work\ChangeSetPersister.js:24:13)
at async UnitOfWork.commitCreateChangeSets (P:\.Projektek\lireddit-server\node_modules\@mikro-orm\core\unit-of-work\UnitOfWork.js:496:9)
at async UnitOfWork.persistToDatabase (P:\.Projektek\lireddit-server\node_modules\@mikro-orm\core\unit-of-work\UnitOfWork.js:458:13)
at async PostgreSqlConnection.transactional (P:\.Projektek\lireddit-server\node_modules\@mikro-orm\knex\AbstractSqlConnection.js:53:25)
at async UnitOfWork.commit (P:\.Projektek\lireddit-server\node_modules\@mikro-orm\core\unit-of-work\UnitOfWork.js:183:17)
at async SqlEntityManager.flush (P:\.Projektek\lireddit-server\node_modules\@mikro-orm\core\EntityManager.js:486:9)
at async SqlEntityManager.persistAndFlush (P:\.Projektek\lireddit-server\node_modules\@mikro-orm\core\EntityManager.js:438:9)
previous error: insert into "post" ("created_at", "title", "updated_at") values ('2021-04-05T21:04:23.126Z', 'my
first post', '2021-04-05T21:04:23.126Z') returning "_id" - relation "post" does not exist
at Parser.parseErrorMessage (P:\.Projektek\lireddit-server\node_modules\pg-protocol\dist\parser.js:278:15)
at Parser.handlePacket (P:\.Projektek\lireddit-server\node_modules\pg-protocol\dist\parser.js:126:29)
at Parser.parse (P:\.Projektek\lireddit-server\node_modules\pg-protocol\dist\parser.js:39:38)
at Socket.<anonymous> (P:\.Projektek\lireddit-server\node_modules\pg-protocol\dist\index.js:10:42)
at Socket.emit (events.js:315:20)
at Socket.EventEmitter.emit (domain.js:467:12)
at addChunk (internal/streams/readable.js:309:12)
at readableAddChunk (internal/streams/readable.js:284:9)
at Socket.Readable.push (internal/streams/readable.js:223:10)
at TCP.onStreamRead (internal/stream_base_commons.js:188:23) {
length: 166,
severity: 'ERROR',
code: '42P01',
detail: undefined,
hint: undefined,
position: '13',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'd:\pginstaller_13.auto\postgres.windows-x64\src\backend\parser\parse_relation.c',
line: '1376',
routine: 'parserOpenTable'
}
Index.ts:
import { MikroORM } from "@mikro-orm/core";
import { __prod__ } from "./constants";
import { Post } from "./entities/Post";
import mikroConfig from "./mikro-orm.config";
const main = async () => {
const orm = await MikroORM.init(mikroConfig);
await orm.getMigrator().up;
const post = orm.em.create(Post, { title: "my first post" });
await orm.em.persistAndFlush(post);
};
main().catch((err) => {
console.error(err);
});
Post.ts:
import { Entity, PrimaryKey, Property } from "@mikro-orm/core";
@Entity()
export class Post {
@PrimaryKey()
_id!: number;
@Property({ type: "date" })
createdAt = new Date();
@Property({ type: "date", onUpdate: () => new Date() })
updatedAt = new Date();
@Property({ type: "text" })
title!: string;
}
mikro-orm.config.ts:
import { __prod__ } from "./constants";
import { Post } from "./entities/Post";
import { MikroORM } from "@mikro-orm/core";
import path from "path";
export default {
migrations: {
path: path.join(__dirname, "./migrations"),
pattern: /^[\w-]+\d+\.[tj]s$/,
},
entities: [Post],
dbName: "postgres",
debug: !__prod__,
type: "postgresql",
password: "hellothere",
} as Parameters<typeof MikroORM.init>[0];
以及我使用 npx mikro-orm 创建的迁移 migration:create:
import { Migration } from '@mikro-orm/migrations';
export class Migration20210405205411 extends Migration {
async up(): Promise<void> {
this.addSql('create table "post" ("_id" serial primary key, "created_at" timestamptz(0) not null, "updated_at" timestamptz(0) not null, "title" text not null);');
}
}
在那之后我将它编译成 js 顺便说一句,但我想问题出在我的代码或 idk 的某个地方请帮助我,我可以给你更多信息只是请帮助,我一直在尝试修复这个错误5 小时 :/
Btw Im doin Ben Awad's 14 hour fullstack tutorial if its matter.
我遇到了同样的问题。这就是我所做的:
- 我删除了
migrations
文件夹以及 dist
文件夹
- 我运行
npx mikro-orm migration:create --initial
之后,我重新启动了 yarn watch
和 yarn dev
,它对我有用。
注意 --initial
标志。我建议检查 official documentation。迁移 table 用于跟踪已执行的迁移。当你只 运行 npx mikro-orm migration:create
时,table 将不会被创建,因此 MikroORM 无法检查 Post 实体的迁移是否已经执行(包括创建数据库中的相应 table)。
Ben 在他的教程中没有使用 --initial
标志,他可能在教程之前已经 运行 它了。
当您尝试在初始化 table 的架构(或结构)之前添加数据时,会发生 TableNotFoundException
。
像 中那样传递 --initial
对我不起作用,可能是因为我在 ./mikro-orm.config.ts
中传递了用户名和密码。
我使用 Mikro-ORM 的 SchemaGenerator 来初始化 table,如官方文档中 here 所示。
在 index.ts
的主函数中向 post 添加数据之前添加以下行:
const generator = orm.getSchemaGenerator();
await generator.updateSchema();
index.ts
中的主要函数现在应该如下所示:
const main = async () => {
const orm = await MikroORM.init(mikroConfig);
await orm.getMigrator().up;
const generator = orm.getSchemaGenerator();
await generator.updateSchema();
const post = orm.em.create(Post, { title: "my first post" });
await orm.em.persistAndFlush(post);
};
updateSchema
创建一个 table 或根据 .entities/Post.ts
更新它。当 Post 文件更新时,这可能会导致问题,我在遵循 Ben 的教程时还没有 运行 。虽然,我仍然建议创建 ./create-schema.ts
并在需要时 运行 设置它,如 official docs.
中所示
我自己也有类似的问题(也在做 Ben Awad 的教程)。
我使用 Mikro-ORM 的模式生成器来初始化 table,就像在 中一样,但问题仍然存在。
直到我将我的用户设置为拥有超级用户权限后它才开始工作。
我将 postgresql 用于我使用自制软件下载的数据库。如果你有类似的设置,我就是这样做的:
使用 psql postgres
在您的终端中启动 psql。如果需要,您可以通过在 shell 中键入 \du
来查看您的用户并检查他们的权限。然后,要更改用户的权限,请使用命令 ALTER ROLE <username> WITH SUPERUSER;
。确保包含 分号 否则它不会 运行 命令。
查看 this 文章以获取有关 psql 命令的更多信息。
我遇到了同样的问题,我通过在项目上安装 ts-node 解决了这个问题
npm i -D ts-node
并将 package.json 上的 useTsNode 设置为 true。
问题是 mikro-orm cli 仅在 属性 useTsNode 为真且安装了 ts-node 时才在 configPaths 中添加 ts 文件路径。
我遇到的其他问题是 mikro-orm.config.ts 中模式 属性 中的正则表达式是错误的,因为打字错误。
如果任何建议的步骤没有为您解决问题,只需...
退出 yarn watch 和 yarn dev
运行 来自命令行的此命令
npx mikro-orm migration:up
现在重新启动 watch 和 dev 就可以了。
我也经历过。而像可能是因为我在./mikro-orm.config.ts
.
中传递了用户名和密码
我的解决方案是简单地在 postgresql 终端中执行在 ./src/migrations/Migration<NUMBERS>.ts
文件中生成的 sql 命令。
这是我在数据库中执行的命令,
create table "post" ("id" serial primary key, "created_at" timestamptz(0) not null, "updated_at" timestamptz(0) not null, "title" text not null);
就像他们在 doc、
中建议的那样
A safe approach would be generating the SQL on development server and
saving it into SQL Migration files that are executed manually on the
production server.
所以
控制台:
yarn dev
yarn run v1.22.10
$ nodemon dist/index.js
[nodemon] 2.0.7
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node dist/index.js`
[discovery] ORM entity discovery started, using ReflectMetadataProvider
[discovery] - processing entity Post
[discovery] - entity discovery finished, found 1 entities, took 21 ms
[info] MikroORM successfully connected to database postgres on postgresql://postgres:*****@127.0.0.1:5432
[query] begin
[query] insert into "post" ("created_at", "title", "updated_at") values ('2021-04-05T21:04:23.126Z', 'my first post', '2021-04-05T21:04:23.126Z') returning "_id" [took 12 ms]
[query] rollback
TableNotFoundException: insert into "post" ("created_at", "title", "updated_at") values ('2021-04-05T21:04:23.126Z', 'my first post', '2021-04-05T21:04:23.126Z') returning "_id" - relation "post" does not exist
at PostgreSqlExceptionConverter.convertException (P:\.Projektek\lireddit-server\node_modules\@mikro-orm\postgresql\PostgreSqlExceptionConverter.js:36:24)
at PostgreSqlDriver.convertException (P:\.Projektek\lireddit-server\node_modules\@mikro-orm\core\drivers\DatabaseDriver.js:194:54)
at P:\.Projektek\lireddit-server\node_modules\@mikro-orm\core\drivers\DatabaseDriver.js:198:24
at processTicksAndRejections (internal/process/task_queues.js:93:5)
at async PostgreSqlDriver.nativeInsert (P:\.Projektek\lireddit-server\node_modules\@mikro-orm\knex\AbstractSqlDriver.js:150:21)
at async ChangeSetPersister.persistNewEntity (P:\.Projektek\lireddit-server\node_modules\@mikro-orm\core\unit-of-work\ChangeSetPersister.js:55:21)
at async ChangeSetPersister.executeInserts (P:\.Projektek\lireddit-server\node_modules\@mikro-orm\core\unit-of-work\ChangeSetPersister.js:24:13)
at async UnitOfWork.commitCreateChangeSets (P:\.Projektek\lireddit-server\node_modules\@mikro-orm\core\unit-of-work\UnitOfWork.js:496:9)
at async UnitOfWork.persistToDatabase (P:\.Projektek\lireddit-server\node_modules\@mikro-orm\core\unit-of-work\UnitOfWork.js:458:13)
at async PostgreSqlConnection.transactional (P:\.Projektek\lireddit-server\node_modules\@mikro-orm\knex\AbstractSqlConnection.js:53:25)
at async UnitOfWork.commit (P:\.Projektek\lireddit-server\node_modules\@mikro-orm\core\unit-of-work\UnitOfWork.js:183:17)
at async SqlEntityManager.flush (P:\.Projektek\lireddit-server\node_modules\@mikro-orm\core\EntityManager.js:486:9)
at async SqlEntityManager.persistAndFlush (P:\.Projektek\lireddit-server\node_modules\@mikro-orm\core\EntityManager.js:438:9)
previous error: insert into "post" ("created_at", "title", "updated_at") values ('2021-04-05T21:04:23.126Z', 'my
first post', '2021-04-05T21:04:23.126Z') returning "_id" - relation "post" does not exist
at Parser.parseErrorMessage (P:\.Projektek\lireddit-server\node_modules\pg-protocol\dist\parser.js:278:15)
at Parser.handlePacket (P:\.Projektek\lireddit-server\node_modules\pg-protocol\dist\parser.js:126:29)
at Parser.parse (P:\.Projektek\lireddit-server\node_modules\pg-protocol\dist\parser.js:39:38)
at Socket.<anonymous> (P:\.Projektek\lireddit-server\node_modules\pg-protocol\dist\index.js:10:42)
at Socket.emit (events.js:315:20)
at Socket.EventEmitter.emit (domain.js:467:12)
at addChunk (internal/streams/readable.js:309:12)
at readableAddChunk (internal/streams/readable.js:284:9)
at Socket.Readable.push (internal/streams/readable.js:223:10)
at TCP.onStreamRead (internal/stream_base_commons.js:188:23) {
length: 166,
severity: 'ERROR',
code: '42P01',
detail: undefined,
hint: undefined,
position: '13',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'd:\pginstaller_13.auto\postgres.windows-x64\src\backend\parser\parse_relation.c',
line: '1376',
routine: 'parserOpenTable'
}
Index.ts:
import { MikroORM } from "@mikro-orm/core";
import { __prod__ } from "./constants";
import { Post } from "./entities/Post";
import mikroConfig from "./mikro-orm.config";
const main = async () => {
const orm = await MikroORM.init(mikroConfig);
await orm.getMigrator().up;
const post = orm.em.create(Post, { title: "my first post" });
await orm.em.persistAndFlush(post);
};
main().catch((err) => {
console.error(err);
});
Post.ts:
import { Entity, PrimaryKey, Property } from "@mikro-orm/core";
@Entity()
export class Post {
@PrimaryKey()
_id!: number;
@Property({ type: "date" })
createdAt = new Date();
@Property({ type: "date", onUpdate: () => new Date() })
updatedAt = new Date();
@Property({ type: "text" })
title!: string;
}
mikro-orm.config.ts:
import { __prod__ } from "./constants";
import { Post } from "./entities/Post";
import { MikroORM } from "@mikro-orm/core";
import path from "path";
export default {
migrations: {
path: path.join(__dirname, "./migrations"),
pattern: /^[\w-]+\d+\.[tj]s$/,
},
entities: [Post],
dbName: "postgres",
debug: !__prod__,
type: "postgresql",
password: "hellothere",
} as Parameters<typeof MikroORM.init>[0];
以及我使用 npx mikro-orm 创建的迁移 migration:create:
import { Migration } from '@mikro-orm/migrations';
export class Migration20210405205411 extends Migration {
async up(): Promise<void> {
this.addSql('create table "post" ("_id" serial primary key, "created_at" timestamptz(0) not null, "updated_at" timestamptz(0) not null, "title" text not null);');
}
}
在那之后我将它编译成 js 顺便说一句,但我想问题出在我的代码或 idk 的某个地方请帮助我,我可以给你更多信息只是请帮助,我一直在尝试修复这个错误5 小时 :/
Btw Im doin Ben Awad's 14 hour fullstack tutorial if its matter.
我遇到了同样的问题。这就是我所做的:
- 我删除了
migrations
文件夹以及dist
文件夹 - 我运行
npx mikro-orm migration:create --initial
之后,我重新启动了 yarn watch
和 yarn dev
,它对我有用。
注意 --initial
标志。我建议检查 official documentation。迁移 table 用于跟踪已执行的迁移。当你只 运行 npx mikro-orm migration:create
时,table 将不会被创建,因此 MikroORM 无法检查 Post 实体的迁移是否已经执行(包括创建数据库中的相应 table)。
Ben 在他的教程中没有使用 --initial
标志,他可能在教程之前已经 运行 它了。
当您尝试在初始化 table 的架构(或结构)之前添加数据时,会发生 TableNotFoundException
。
像 --initial
对我不起作用,可能是因为我在 ./mikro-orm.config.ts
中传递了用户名和密码。
我使用 Mikro-ORM 的 SchemaGenerator 来初始化 table,如官方文档中 here 所示。
在 index.ts
的主函数中向 post 添加数据之前添加以下行:
const generator = orm.getSchemaGenerator();
await generator.updateSchema();
index.ts
中的主要函数现在应该如下所示:
const main = async () => {
const orm = await MikroORM.init(mikroConfig);
await orm.getMigrator().up;
const generator = orm.getSchemaGenerator();
await generator.updateSchema();
const post = orm.em.create(Post, { title: "my first post" });
await orm.em.persistAndFlush(post);
};
updateSchema
创建一个 table 或根据 .entities/Post.ts
更新它。当 Post 文件更新时,这可能会导致问题,我在遵循 Ben 的教程时还没有 运行 。虽然,我仍然建议创建 ./create-schema.ts
并在需要时 运行 设置它,如 official docs.
我自己也有类似的问题(也在做 Ben Awad 的教程)。
我使用 Mikro-ORM 的模式生成器来初始化 table,就像在
直到我将我的用户设置为拥有超级用户权限后它才开始工作。
我将 postgresql 用于我使用自制软件下载的数据库。如果你有类似的设置,我就是这样做的:
使用 psql postgres
在您的终端中启动 psql。如果需要,您可以通过在 shell 中键入 \du
来查看您的用户并检查他们的权限。然后,要更改用户的权限,请使用命令 ALTER ROLE <username> WITH SUPERUSER;
。确保包含 分号 否则它不会 运行 命令。
查看 this 文章以获取有关 psql 命令的更多信息。
我遇到了同样的问题,我通过在项目上安装 ts-node 解决了这个问题
npm i -D ts-node
并将 package.json 上的 useTsNode 设置为 true。
问题是 mikro-orm cli 仅在 属性 useTsNode 为真且安装了 ts-node 时才在 configPaths 中添加 ts 文件路径。
我遇到的其他问题是 mikro-orm.config.ts 中模式 属性 中的正则表达式是错误的,因为打字错误。
如果任何建议的步骤没有为您解决问题,只需...
退出 yarn watch 和 yarn dev 运行 来自命令行的此命令
npx mikro-orm migration:up
现在重新启动 watch 和 dev 就可以了。
我也经历过。而像./mikro-orm.config.ts
.
我的解决方案是简单地在 postgresql 终端中执行在 ./src/migrations/Migration<NUMBERS>.ts
文件中生成的 sql 命令。
这是我在数据库中执行的命令,
create table "post" ("id" serial primary key, "created_at" timestamptz(0) not null, "updated_at" timestamptz(0) not null, "title" text not null);
就像他们在 doc、
中建议的那样A safe approach would be generating the SQL on development server and saving it into SQL Migration files that are executed manually on the production server.