使用sequelize-typescript持久化JSON

时间:2019-12-10 22:55:26

标签: typescript sequelize.js sequelize-typescript

我想使用sequelize-typescript在MariaDB中存储一个简单的JSON-Array。这是一个可以在PostgreSQL,SQLite和MySQL中运行的基本模型。

class MyModel extends Model<MyModel> {
  @Column({
    type: DataType.JSON
  })
  options!: string[]
}

要在MariaDB中获得相同的行为,我尝试了四件事:

1。使用@AfterFind或其他挂钩。

问题:如本issue in the github repo所述,存在一个已知的错误,即钩子不会在包含的模型上触发,因此没有机会

2。实现自己的自定义JSON数据类型(首选解决方案)

问题::即使复制example in the sequelize-docs也会引发各种打字稿编译器问题,即使我使用any类型并欺骗TS编译器,我也不知道如何分辨在其他模型中,有一个新的数据类型。

3。对同一属性使用吸气剂/设置器

class MyModel extends Model<MyModel> {
  @Column({
    type: DataType.STRING
  })
  get options(): string[] {
    return JSON.parse(this.getDataValue('options'))
  }

  set options(value: string[]) {
    this.setDataValue('options', JSON.stringify(value))
  }
}

这会引发getDataValuesetDataValue方法的编译器错误:

Argument of type 'string' is not assignable to parameter of type 'this["options"]'
Type 'string' is not assignable to type 'string[]'

4。在私有财产中使用吸气剂/设置器

有效的方法是将Array作为字符串存储在数据库中,并使用getter / setter访问和解析此属性。

class MyModel extends Model<MyModel> {
  @Column
  _options!: string;

  get options(): string[] {
    return JSON.parse(this._options)
  }

  set options(value: string[]) {
    this._options = JSON.stringify(value)
  }
}

就像我说的那样,这行得通,但是我希望有一些通用的东西,对于大量字段(例如自定义数据类型)更快地运行。

所以我的问题是:
是否有一种方便,简短,轻松,动态且可重用的方式将JSON存储在MariaDB中?

0 个答案:

没有答案