IT

멀티 테넌트 지원을 위한 Sequelize에서 데이터베이스 동적 정의 잘못된 쿼리 구문 반환

itgroup 2023. 9. 10. 12:10
반응형

멀티 테넌트 지원을 위한 Sequelize에서 데이터베이스 동적 정의 잘못된 쿼리 구문 반환

Shared Database Isolated Schema 원칙으로 SAAS(Multi-tenant Application) 작업 중입니다.

https://github.com/renatoargh/data-isolation-example 의 솔루션을 사용해 보았습니다.

이 기사 https://renatoargh.wordpress.com/2018/01/10/logical-data-isolation-for-multi-tenant-architecture-using-node-express-and-sequelize/ 에서

스키마 옵션을 사용한 후속 모델입니다.

module.exports = (sequelize, DataTypes) => {
  const Task = sequelize.define('Task', {
    id: {
      type: DataTypes.INTEGER,
      allowNull: false,
      primaryKey: true,
      field: 'Id'
    },

    description: {
      type: DataTypes.STRING(100),
      allowNull: false,
      field: 'Description'
    },

    done: {
      type: DataTypes.BOOLEAN,
      allowNull: false,
      default: false,
      field: 'Done'
    },

    taskTypeId: {
      type: DataTypes.INTEGER,
      allowNull: true,
      field: 'TaskTypeId'
    },

    userId: {
      type: DataTypes.INTEGER,
      allowNull: true,
      field: 'UserId'
    }
  }, {
      freezeTableName: true,
      tableName: 'Tasks',
      createdAt: false,
      updatedAt: false
    })
  Task.changeSchema = schema => Task.schema(schema)
  Task.associate = models => {
    Task.belongsTo(models.TaskType, {
      as: 'taskType',
      foreignKey: 'taskTypeId'
    })
  }


  return Task
}

그리고 이 문제는 그만 두십시오.

SELECT
  `Task`.`Id`              AS `id`,
  `Task`.`Description`     AS `description`,
  `Task`.`Done`            AS `done`,
  `Task`.`TaskTypeId`      AS `taskTypeId`,
  `Task`.`UserId`          AS `userId`,
  `taskType`.`Id`          AS `taskType.id`,
  `taskType`.`Description` AS `taskType.description`
FROM `tenant_1.Tasks` AS `Task` LEFT OUTER JOIN `shared.TaskTypes` AS `taskType`
    ON `Task`.`TaskTypeId` = `taskType`.`Id`
WHERE `Task`.`UserId` = 1;

보다시피 'tenant_1'에서.mysql의 tasks'는 잘못된 구문입니다. 이 구문은 'tenant_1'이어야 합니다.'과제'

'tenant_1'을(를) 변경하는 방법입니다.tasks'부터 'tenant_1'까지입니다.'과제'

MySQL을 사용하고 있습니까?만약 그렇다면, 그것이 예상되는 행동입니다.

모델의 설명서에서.스키마:

이 모델에 스키마를 적용합니다.포스트그레스의 경우 실제로 스키마가 테이블 이름 앞에 배치됩니다."schema"."tableName", 스키마는 mysql 및 sqlite의 테이블 이름 앞에 붙여집니다.'schema.tablename'.

언급URL : https://stackoverflow.com/questions/54018609/dynamic-define-database-in-sequelize-for-multi-tenant-support-return-wrong-query

반응형