При использовании Serverless Framework с AWS автоматически сгенерированные псевдонимы таблиц Sequelize различаются в зависимости от среды (автономная или Lambda).

Я использую Serverless Framework с плагином serverless-offline. Я разрабатывал функцию AWS Lambda в автономном режиме и пока не имел серьезных проблем.

Мне нужно выполнить более сложный SQL-запрос, поэтому я решил использовать метод literal для написания некоторого чистого SQL. Я проверил журнал и увидел, что Sequelize (с sequelize-typescript) присваивал псевдонимы именам таблиц, чтобы они соответствовали именам моделей (или, в случае отношений таблиц, псевдонимы совпадали с ключом, которому была назначена связь. Я написал свой SQL соответственно и получил следующее.

const customer = await this.findOne({
    include: [Coupons, CustomersInfo],
    where: {
        email_address: {
            [Op.eq]: sql.literal(`binary '${email}'`)
        },
        authorization_level: {
            [Op.ne]: 6
        },
        [Op.and]: [
            sql.literal(`
            CASE WHEN '${coupon_code}' is null || '${coupon_code}' = ''
            THEN (coupon.coupon_flag !=2 || coupon.coupon_flag is null)
            ELSE Customers.referral = '${coupon_code}'
            END
        `)
        ]
    },
});

Итак, снова, чтобы уточнить, в журналах я мог видеть, что таблица клиентов была привязана к клиентам, а таблица купонов была привязана к купону.

Я провел кучу локальных разработок в автономном режиме, используя плагин serverless-offline, просто поставил его на лямбду и ... он не работает.

Это не работает, потому что по какой-то причине в Lambda одна и та же таблица клиентов имеет псевдоним l. Если я отредактирую свой жестко закодированный запрос, чтобы он ссылался на таблицу клиентов как l, тогда он отлично работает с Lambda ... но он перестает работать в автономном режиме, потому что в автономном режиме он становится псевдонимом Customers.

Есть ли способ заставить Sequelize присвоить таблице определенное имя? Или что-то, что я могу сделать, чтобы нормализовать имена между двумя средами?




Ответы (1)


Я понял это, когда набирал вопрос, поэтому напишу ответ.

Проблема заключалась в том, что мой код сворачивался при развертывании как лямбда-функции. Вот соответствующая документация по минификации и sequelize-typescript. После сворачивания псевдоним производной таблицы становился l (и в последующей попытке b). Чтобы заставить псевдоним таблицы быть конкретным именем даже после минимизации, вам нужно определить modelName при создании вашего класса модели. Пример ниже.

@Table({
  tableName: "customers",
  modelName: "xyz",
})
export class Customers extends Model {
  // The rest of your column definitions here...
}

xyz станет именем, которому таблица присвоена псевдонимом в сгенерированном необработанном SQL.

person Michael    schedule 29.01.2021