使用 sequelize-typescript 持久化 JSON

Ale*_*lex 10 sequelize.js typescript sequelize-typescript

我想使用sequelize-typescript. 这是一个可以在 PostgreSQL、SQLite 和 MySQL 中工作的基本模型。

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

为了使用 MariaDB 获得相同的行为,我尝试了四件事:

1. 使用@AfterFind或其他一些钩子。

问题:正如github repo中的这个问题所述,有一个已知的错误,即钩子不会在包含的模型上触发,所以没有机会

2. 实现自己的自定义 JSON Data-Type(首选方案)

问题:即使复制sequelize-docs 中示例也会引发各种打字稿编译器问题,即使我使用any类型并欺骗 TS 编译器,我也不知道如何告诉我的其他模型有一个新的 DataType。

3. 对相同的属性使用 getter/setter

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))
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Argument of type 'string' is not assignable to parameter of type 'this["options"]'
Type 'string' is not assignable to type 'string[]'
Run Code Online (Sandbox Code Playgroud)

4. 对私有属性使用 getter/setter

可行的方法是将数组作为字符串存储在数据库中,并使用 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)
  }
}
Run Code Online (Sandbox Code Playgroud)

正如我所说,这是可行的,但我更希望有一些更通用的东西,可以更快地处理大量字段,例如自定义数据类型。

所以我的问题是:
是否有一种方便、简短、简单、动态和可重用的方式来将 JSON 存储在 MariaDB 中?