Используя бессерверную платформу с AWS, автоматически сгенерированные псевдонимы таблиц Sequelize различаются в зависимости от среды (автономная или автономная Лямбда)

#aws-lambda #sequelize.js #serverless-framework #sequelize-typescript #serverless-offline

#aws-лямбда #sequelize.js #бессерверный фреймворк #продолжение-typescript #бессерверный-автономный

Вопрос:

Я использую бессерверную платформу с подключаемым модулем 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
        `)
        ]
    },
});
 

Итак, еще раз, чтобы уточнить, в журналах я мог видеть, что таблица customers была переименована в «Customers», а таблица купонов была переименована в «coupon».

Я выполнил множество локальных разработок в автономном режиме с помощью serverless-offline плагина, просто разместил его на lambda и… это не работает.

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

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

Ответ №1:

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

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

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

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