Búsqueda de sitios web

sequelize.js - Persistiendo JSON con sequelize-typescript


Quiero almacenar un JSON-Array simple en un MariaDB usando sequelize-typescript. Aquí hay un Modelo básico que funcionaría en PostgreSQL, SQLite y MySQL.

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

Para obtener el mismo comportamiento con MariaDB intenté cuatro cosas:

1. Usa @AfterFind u otro hook.

Problema: Como se indica en este problema en el repositorio de GitHub, hay un error conocido que hace que los hooks no se activen en los modelos incluidos, por lo que no hay oportunidad

2. Implementar un tipo de datos JSON personalizado propio (solución preferida)

Problema: Incluso copiando el ejemplo en la documentación de Sequelize se generan varios problemas con el compilador de TypeScript e incluso si uso tipos any y engaño al compilador de TS, no sé cómo decirle a mis otros modelos que hay un nuevo DataType.

3. Usa un getter/setter para la misma propiedad

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))
  }
}

Esto genera errores de compilación para los métodos getDataValue y setDataValue:

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

4. Usa un getter/setter para una propiedad privada

Lo que funcionaría es simplemente almacenar el Array como una cadena en la base de datos y usar un getter/setter para acceder y analizar esta propiedad.

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)
  }
}

Como dije, eso funciona, pero me gustaría tener algo más genérico que funcione más rápido para un mayor número de campos, como un tipo de dato personalizado.

Entonces mi pregunta es:
¿Hay una manera conveniente, corta, fácil, dinámica y reutilizable de almacenar JSON en MariaDB?

Artículos relacionados