postgres 不支持 TypeORM 数组?

ben*_*sky 22 javascript postgresql node.js typescript typeorm

我有一列kid_agesInteger[]. 迁移时,我收到以下错误:

DataTypeNotSupportedError: Data type "Array" in "home.kid_ages" is not supported by "postgres" database.

我尝试将以下选项添加到我的专栏中:

type: 'array'
Run Code Online (Sandbox Code Playgroud)

和:

array: true,
default: [],
nullable: false,`

@Column({
  array: true,
  default: [],
  nullable: false,
})
kid_ages: string;`
Run Code Online (Sandbox Code Playgroud)

tho*_*paw 51

文档说,它应该可以工作:

@Column("int", { array: true })
array: number[];
Run Code Online (Sandbox Code Playgroud)

这是来自示例https://github.com/typeorm/typeorm/blob/master/test/functional/database-schema/column-types/postgres/entity/Post.ts

在您的代码中,数组属性不是数组。你试过kid_ages: string[];吗?


Hum*_*mad 13

我尝试了已经提到的所有解决方案,但没有一个有效。最终在 TypeORM 存储库中的 Github 问题中找到了解决方案。

我引用一下解决方案:

这是一个简单的修复,列的类型不应该是数组。改成这样,现在可以工作了:

@Column({array: true})
tags: string;
Run Code Online (Sandbox Code Playgroud)

关于数组的更好的文档会很有用。

来源


Dmi*_*nin 10

如上所述,您可以使用以下代码创建 Postgres 的数组列:

@Column("int", { array: true })
kid_ages: number[];
Run Code Online (Sandbox Code Playgroud)

如果您需要找到一些 5 岁的孩子,请使用以下命令:

kid = getRepository('kid')
        .createQueryBuilder()
        .where(':kid_age = ANY (kid.kid_ages)', { kid_age: 5 });
Run Code Online (Sandbox Code Playgroud)

  • 实际上今天(^0.3.0)使用这个就足够了:`repository.find({ where: { kids_ages: ArrayContains([5]), }}` (3认同)

小智 10

我的 Postgres 检查数组包含的解决方案如下:

我对该列的定义如下:

    @Column("text", { array: true, default: "{}" })
    tags: string[];
Run Code Online (Sandbox Code Playgroud)
this.getFindQueryBuilder().where("recipe.tags && ARRAY[:...tags]", {tags: tags})
Run Code Online (Sandbox Code Playgroud)

“getFindQueryBuilder”:是一个获取共享SelectQueryBuilder以节省代码的函数。

这里重要的部分是我在示例中显示的 where 子句。


A. *_*tre 6

对于希望在您的实体中处理数组或字符串的人,根据 @thopaw 的回答,您可以使用以下代码:

@Column("text", { array: true })
kid_ages: string[];
Run Code Online (Sandbox Code Playgroud)


Gau*_*rma 5

这里需要注意的重要一点是,即使声明整数数组,默认值也应该定义为空对象。

@Column("int", { array: true, default: {} })
ages: Number[];
Run Code Online (Sandbox Code Playgroud)