-1

我正在尝试遵循 lireddit 教程,并且遇到了第一个 mikro-orm 迁移。

我遇到了与这篇文章中报告的相同的问题。

我已经修改了示例实体构造函数(尽管使用 mikro-orm 文档中提供的格式会导致相同的问题)。

目前,我有一个Posts.ts文件:

import { Entity, PrimaryKey, Property } from "@mikro-orm/core";
// import { v4 } from 'uuid';

@Entity()
export class Post {
  @PrimaryKey()
  id!: number;
  // uuid: string = v4();

  // @SerializedPrimaryKey()
  // id!: string;

  @Property({ type: "date" })
  createdAt: Date = new Date();

  @Property({ type: "date", onUpdate: () => new Date() })
  updatedAt: Date = new Date();

  @Property({ type: "text" })
  title!: string;
}

代码运行:

const main = async () => {
  const orm = await MikroORM.init(config);
  await orm.getMigrator().up();
  const post = orm.em.create(Post, {title: "first title"});
  await orm.em.persistAndFlush(post);
};

main().catch((err) => {
    console.log(err);
});

错误消息说:

NotNullConstraintViolationException:插入“post”(“created_at”、“title”、“updated_at”)值('2021-08-18T22:13:54.599Z'、'first title'、'2021-08-18T22:13:54.599 Z') 返回“id” - 关系“post”的“_id”列中的空值违反 PostgreSqlExceptionConverter.convertException 的非空约束

我不知道这意味着什么或如何在id列上设置一个数字。我注意到 mikro-orm 文档使用下划线前缀定义主键(也不确定下划线在做什么),并将其指定为 ObjectId,然后使用序列化的主键。我试过使用这种格式并得到同样的错误。

我也试过:

  1. 添加uuid为主键(而不是id) - 显示在上面的注释代码中,但我得到了同样的错误。

  2. post在const中添加一个数字作为 id :

    const post = orm.em.create(Post, {title: "first title", id: 2});
    

这也会生成一个 NotNullConstraintViolationException: 错误,说它id是空的。

  1. 这篇文章的建议之一是将以下内容添加到index.ts.

    const generator = orm.getSchemaGenerator();
    await generator.updateSchema();
    

我试过这个,当我运行时yarn dev,终端只是挂在启动命令上(手表环境中没有显示错误)。

yarn run v1.22.11
$ nodemon dist/index.js
[nodemon] 2.0.12
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node dist/index.js`
  1. 我删除了这两行并再次尝试,这次使用mikro-orm migration:create命令上的初始标志(在删除我的节点模块文件夹、dist文件夹和src/migrations文件夹之后)。

当我尝试时,它说

Error: Initial migration cannot be created, as some migrations already exist. The files listed are in the node modules folder.
  1. 我还尝试设置useTsNodetruein package.json- 并遇到与上述相同的问题。

有没有人弄清楚这一点?

我注意到的一件事是,在删除 dist 文件夹和节点模块并重新运行 yarn 后,该dist/index.js文件看起来不像 Ben 的原始文件。它现在说:

"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const core_1 = require("@mikro-orm/core");
const Post_1 = require("./entities/Post");
const mikro_orm_config_1 = __importDefault(require("./mikro-orm.config"));
const main = () => __awaiter(void 0, void 0, void 0, function* () {
    const orm = yield core_1.MikroORM.init(mikro_orm_config_1.default);
    yield orm.getMigrator().up();
    const post = orm.em.create(Post_1.Post, { title: "first title" });
    yield orm.em.persistAndFlush(post);
});
main().catch((err) => {
    console.log(err);
});
//# sourceMappingURL=index.js.map

然后我尝试创建一个新实体,称为Posted(与 相同Post,但名称相同)。

当我尝试创建该迁移(必须是新的)时,我收到一条错误消息:

TypeError:无法使用“in”运算符在未定义中搜索“schema”

然后它会列出文件node_modules夹中的许多文件,如

at MetadataDiscovery.prepare node_modules/@mikro-orm/core/metadata/MetadataDiscovery.js:135:22)
at MetadataDiscovery.discoverReferences /@mikro-orm/core/metadata/MetadataDiscovery.js:125:48)
at MetadataDiscovery.findEntities node_modules/@mikro-orm/core/metadata/MetadataDiscovery.js:71:20)
at async MetadataDiscovery.discover /node_modules/@mikro-orm/core/metadata/MetadataDiscovery.js:34:9)
at async Function.init /node_modules/@mikro-orm/core/MikroORM.js:42:24)
4

1 回答 1

0

NotNullConstraintViolationException:插入“post”(“created_at”、“title”、“updated_at”)值('2021-08-18T22:13:54.599Z'、'first title'、'2021-08-18T22:13:54.599 Z') 返回“id” - 关系“post”的“_id”列中的空值违反 PostgreSqlExceptionConverter.convertException 的非空约束

此错误表示您的数据库有一个名为“_id”的列,并且它不能为空(必须有一个 _id 值),但是您没有提供它。

这个问题确实必须在您的数据库中修复。我建议使用 DB 的 GUI 管理工具。我使用 TablePlus。

打开 TablePlus,连接到您的数据库,(提供用户名和密码,将主机设置为 127.0.0.1,设置端口号,指定要连接的数据库)然后使用连接,检查您的数据库。应该有一个名为 _id 的列。删除它,或将其重命名为 id。

我认为创建 _id 的原因是因为您使用了大写的 Id。

例如,如果您在 mikroorm 中创建了一个名为 updatedAt 的属性,那么在数据库中该列称为 updated_at,而不是 updatedAt,因为 sql 不区分大小写。因此,如果您将其命名为 Id,那么它将是数据库中的 _id

于 2021-11-18T03:06:39.983 回答