TypeORM jsonb 数组列

2024-02-19

我正在开发一个节点微服务,orm和b分别是typeorm and postgresql

我正在尝试创建jsonb数组列,但我可能没有以正确的方式进行操作。

Notes

  1. 我通常会通过简单地添加一个简单的额外实体和关系来完成此任务。在这种情况下,我被要求使用jsonb类型以便能够修改界面而不适应架构更改。
  2. 目前,存储一个简单的索引 ID 列表也同样足够了。
  3. 我不确定我应该使用array: true列选项。我尝试使用普通的jsonb对象没有成功("{}"::jsonb ).

My aim:

存储对象数组indexed id列,并能够添加和删除 id。如果这是不可能的,可以使用平面索引字符串数组。

e.g:

[ {id: 'some-uuid-000'}, {id: 'some-uuid-001'}, ... ]

or:

['some-uuid-000', 'some-uuid-001', 'some-uuid-002']

Code:

我的列定义:

@Column({
        type: 'jsonb',
        array: true,
        default: () => 'ARRAY[]::jsonb[]',
        nullable: false,
    })
    public users: Array<{ id: string }> = [];

我设法获取空数组

const group = await repo.findOneOrFail({ id: groupId });
console.log('>>>>>', group.users);

其输出:

>>>>> []

当尝试将项目添加到数组并保持如下时

return repo.update(groupId, { users: [...group.users, { id: userId }] });

我得到以下输出:

2019-12-21 14:40:44.088 UTC [556] ERROR:  malformed array literal: "[{"id":"cc135b8a-b6ed-4cd7-99fc-396228e74509"}]"
2019-12-21 14:40:44.088 UTC [556] DETAIL:  "[" must introduce explicitly-specified array dimensions.
2019-12-21 14:40:44.088 UTC [556] STATEMENT:  UPDATE "group" SET "users" = $2, "created_at" = CURRENT_TIMESTAMP WHERE "id" IN ($1)
(node:5050) UnhandledPromiseRejectionWarning: QueryFailedError: malformed array literal: "[{"id":"cc135b8a-b6ed-4cd7-99fc-396228e74509"}]"

输出错误告诉我配置一定是错误的,因为 postgres 似乎提供了一个普通对象数组,同时期望不同的格式/符号。我在文档中没有找到有关此类场景的更多详细信息。


最终我找到了以下解决方案:罪魁祸首是array需要显式设置为 false 的列选项,如下例所示:

@Column({
        type: 'jsonb',
        array: false,
        default: () => "'[]'",
        nullable: false,
    })
    public users!: Array<{ id: string }>;

当未设置 typeorm 时,会自动推断 postgres 列类型为jsonb[](而不是简单的jsonb) 不允许执行jsonb_set运营。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TypeORM jsonb 数组列 的相关文章

  • 无法通过 phantomjs 网络服务器传送图像文件

    我正在尝试让 phantomjs 网络服务器为我工作 我想提供 2 个文件 html 文件和 png 图像文件 html 文件服务良好并在浏览器中正确呈现 但 png 文件不是 这是服务器的代码 var fs require fs func
  • TypeScript:使用调用签名和构造函数签名实现接口

    是否可以创建一个实现以下接口的对象 interface I string new any 我看到可以实现一个具有调用签名和这个问题的一些字段的接口 使用裸函数签名和其他字段实现 TypeScript 接口 https stackoverfl
  • 如何在 redux-toolkit 中正确使用 PayloadAction 和元类型?

    简化示例 import createSlice PayloadAction from reduxjs toolkit type Cake flavor string size S M L const initialState all Cak
  • 如何在 Mongoose 中设置文档创建的 TTL 日期?

    我正在尝试做一个promoCodeMongoose 中的架构 创建时 我需要能够设置促销代码的到期日期 促销代码不一定相同TTL 我在看这个问题 https stackoverflow com questions 14597241 sett
  • Typescript 中的顶级等待和导入

    我正在研究 Typescript 并遇到问题 我想使用import和顶级await但目前 我一次只能使用一个 这是我的配置tsconfig json这允许我使用导入 target ESNext module ESNext 这个允许我使用顶级
  • Angular2 登录后刷新标题

    因此 我有一个标头组件 根据用户是否登录来显示用户名或 登录 我还有一个登录组件 它执行登录的所有业务逻辑 它们目前没有父 子关系 当用户登录时 除非在浏览器中完成整页刷新 否则标题不会刷新或更改 我在网上进行了大量搜索和阅读 了解实现此目
  • hibernate - Postgres - 目标列表最多可以有 1664 个条目

    我们正在使用 hibernate postgres 8 3x 我们的实体是通过急切获取进行多对一映射的 我们与多对一映射有多个关联 当我们向任何其他现有实体添加新列时 我们收到以下错误 目标列表最多可以有 1664 个条目 我搜索了互联网
  • 如何在“nodejs”中查找请求参数

    当我向nodejs服务器发送请求时 当请求发送到nodejs服务器时 我们如何找到请求查询中发送的参数 req param req params req query 所有给予未定义 也当我stringify req请求它给出错误 Conve
  • Nestjs拦截并修改传出的http请求

    所以我可能错过了一些东西或者做错了一些事情 我有一个 NestJS 应用程序正在尝试向外部 API 发出 http 请求 我希望能够拦截此传出请求并在执行之前修改其标头 我尝试使用拦截器 但没有成功 传入的 http 请求被拦截 但传出的请
  • Typescript 上的 Drawflow 库

    我目前正在尝试实现 Jerosoler 制作的很棒的 Drawflow 库 在这里找到 https github com jerosoler Drawflow https github com jerosoler Drawflow 在我的
  • 对嵌套的 observable 进行排序

    我这里有一个 JSON 文件 如下所示 question What is your age range options 10 20 20 30 30 40 40 50 question How did you find us options
  • 为什么通用存储库被视为反模式? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在我看来 许多专门的存储库类都具有相似的特征 并且让这些类实现一个概述这些特征的接口 创建一个通用存储库是有意义的 为了说明我的观点 假设我们有
  • 如何检查nodejs中的服务器和端口是否可用?

    我有一个项目是用 Nodejs 编写的 我需要知道如何检查带有端口的 IP 是否可以连接 前任 检查 example1 com 443 gt true 检查 example1 com 8080 gt false Thanks 了解服务器 端
  • ? LIKE(列 || '%')

    我可以有这样的条件吗 SELECT FROM table WHERE LIKE column 哪里的 是一个字符串参数值 例如 这些参数值 当列等于时应返回 true admin products admin products 1 admi
  • 如何检查 lat long 是否在城市范围内

    如何检查我的纬度 经度是否在城市范围内 或者例如 大伦敦包含在 bbox 0 489 51 28 0 236 51 686 Source http wiki openstreetmap org wiki Bounding Box http
  • 如何将 Chosen 合并到我的 React 项目中?

    我想使用 jquery 插件Chosen https harvesthq github io chosen 在我的项目中 我安装了 jQuery 并通过 npm 选择 npm i jquery chosen js S 这两个库现在都位于我的
  • JPA Criteria API 任意数量的联接/子查询

    我需要使用以下实体构建相交类型查询 为了清楚起见 减少了实体 Entity and other stuff public class Member Id private Long id private String name Entity
  • 错误:找不到模块“@discordjs/opus”

    每次我运行不和谐的语音识别代码时 它都会上线 但一旦加入频道 我的代码就会显示错误 找不到模块 discordjs opus Require stack C Users SURYASH Desktop DiscordSpeechBot no
  • PostgreSQL 中的字符串匹配

    我需要在 PostgreSQL 8 4 中实现正则表达式 据我理解 匹配 似乎正则表达式匹配仅在 9 0 中可用 我的需求是 当我给出输入时14 1我需要得到这些结果 14 1 1 14 1 2 14 1 Z 但排除 14 1 1 1 14
  • Javascript增加最大数组大小[重复]

    这个问题在这里已经有答案了 我正在尝试创建一个大小的数组2 32 4294967296 因为我试图通过运行筛算法来获取 2 32 之前的所有素数 但是 该数组中的任何操作都会出现以下错误 致命错误 CALL AND RETRY LAST 分

随机推荐