#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.