如何解决将 Serverless Framework 与 AWS 结合使用,Sequelize 自动生成的表别名因环境而异离线与 Lambda
我将无服务器框架与无服务器离线插件一起使用。我一直在离线开发 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 上,然后......它不起作用。
它不起作用,因为出于某种原因,在 Lambda 上,同一个客户表的别名为“l”。如果我编辑我的硬编码查询以将客户表引用为“l”,那么它在 Lambda 上运行良好......但它停止离线工作,因为离线它被别名为“客户”。
有没有办法强制 Sequelize 将表别名为某个名称?或者我可以做些什么来规范两个环境之间的名称?
解决方法
我在输入问题时想到了这一点,所以我会继续写出答案。
问题是我的代码在部署为 Lambda 函数时被最小化。 Here is the relevant documentation about minification and sequelize-typescript。最小化后,派生表别名将变为“l”(并在随后的尝试中变为“b”)。为了在最小化后强制表别名为特定名称,您需要在创建模型类时定义 modelName
。示例如下。
@Table({
tableName: "customers",modelName: "xyz",})
export class Customers extends Model {
// The rest of your column definitions here...
}
xyz
将成为表在生成的原始 SQL 中的别名。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。