我想用 mikro-orm 插入,但它找不到我的表:c (TableNotFoundException)

问题描述 投票:0回答:7

所以

控制台:

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'
}

索引.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);
});

帖子.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 迁移创建的迁移: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 个小时了: /

顺便说一句,如果有必要的话,我正在学习 Ben Awad 的 14 小时全栈教程。

postgresql database-migration mikro-orm
7个回答
6
投票

当您尝试在初始化表的架构(或结构)之前添加数据时,会发生

TableNotFoundException

Mosh's Answer
中那样传递--initial对我来说不起作用,可能是因为我在
./mikro-orm.config.ts
中传递了用户名和密码。

我使用 Mikro-ORM 的 SchemaGenerator 来初始化表,如官方文档中here所示。


在添加数据之前添加以下行以发布到

index.ts
中的主函数中:

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
创建表或基于
.entities/Post.ts
更新表。当更新 Post 文件时,这可能会导致问题,我在遵循 Ben 的教程时还没有遇到过任何问题。尽管如此,我仍然建议创建
./create-schema.ts
并在需要时运行它,如 官方文档中所示。


3
投票

我也遇到过同样的问题。这就是我所做的:

  1. 我删除了
    migrations
    文件夹以及
    dist
    文件夹
  2. 我跑了
    npx mikro-orm migration:create --initial

之后,我重新启动了

yarn watch
yarn dev
,它对我有用。

注意

--initial
标志。我建议查看官方文档。迁移表用于跟踪已执行的迁移。当您仅运行
npx mikro-orm migration:create
时,不会创建表,因此 MikroORM 无法检查 Post 实体的迁移是否已执行(包括在数据库上创建相应的表)。

Ben 在他的教程中没有使用

--initial
标志,他可能在本教程之前已经运行过它。


2
投票

我自己也遇到了类似的问题(也在做 Ben Awad 的教程)。

我使用 Mikro-ORM 的模式生成器来初始化表,如 Fares47 的答案,但问题仍然存在。

直到我将用户设置为具有超级用户权限后,它才开始工作。

我使用 postgresql 作为我的数据库,我使用自制程序下载了该数据库。如果你有类似的设置,我就是这样做的:

使用

psql postgres
在终端中启动 psql。如果需要,您可以通过在 shell 中键入
\du
查看您的用户并检查他们的权限。然后,要更改用户的权限,请使用命令
ALTER ROLE <username> WITH SUPERUSER;
。确保包含分号,否则它将不会运行该命令。

查看 this 文章,了解有关 psql 命令的更多信息。


1
投票

我有同样的问题,通过在项目上安装 ts-node 解决了

npm i-D ts-node

并将 package.json 上的 useTsNode 设置为 true。

问题是,如果属性 useTsNode 为 true 并且安装了 ts-node,mikro-orm cli 仅在 configPaths 中添加 ts 文件路径。

我遇到的另一个问题是 mikro-orm.config.ts 中的模式属性中的正则表达式是错误的,因为拼写错误。


1
投票

如果任何建议的步骤未能解决您的问题,只需...

退出yarn watch 和yarn dev 从命令行运行此命令

npx mikro-orm migration:up

现在重新启动手表和开发,你应该就好了。

来自 https://mikro-orm.io/docs/migrations/#migration-class


0
投票

我也经历过这个。就像Fares47所说的那样这可能是因为我在

./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中建议的那样,

一种安全的方法是在开发服务器上生成 SQL 并 将其保存到手动执行的 SQL 迁移文件中 生产服务器。


0
投票

我知道这是一个旧线程,但想提一下,以防其他人处于我的位置,尝试一切但没有任何效果。我的(非常愚蠢的)错误是忘记了

await
迁移运行。

我有什么(但没有用)

orm.getMigrator().up();

你想要什么

await orm.getMigrator().up();
© www.soinside.com 2019 - 2024. All rights reserved.