通过结合使用无服务器框架和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
        `)
        ]
    },
});

再次澄清一下,在日志中,我可以看到customers表被别名为“ Customers”,而coupon表被别名为“ coupon”。

我使用该serverless-offline插件离线进行了很多本地开发,只是将其放在lambda上而已……这是行不通的。

这是行不通的,因为出于某种原因在Lambda上,同一客户表的别名为“ l”。如果我编辑硬编码查询以将“ customers”表引用为“ l”,那么它在Lambda上可以正常使用...但是由于在离线状态下别名为“ Customers”,因此它停止了脱机工作。

有什么方法可以强制Sequelize将表别名为特定名称?或者我可以做一些事情来规范两个环境之间的名称?

麦可

我在输入问题时已经弄清楚了,所以我继续写出答案。

问题在于,将我的代码部署为Lambda函数时,它的代码已最小化。这是有关minification和sequelize-typescript的相关文档一旦最小化,派生表别名将变为“ l”(在随后的尝试中为“ b”)。为了即使在最小化后也要强制表别名为特定名称,您需要modelName在创建模型类时进行定义下面的例子。

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

xyz将成为该表中所产生的原始SQL别名的名字。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档