将无服务器框架与 AWS 结合使用,Sequelize 自动生成的 table 别名因环境而异(离线与 Lambda)

Using the Serverless Framework with AWS, Sequelize's auto-generated table aliases differ depending on environment (offline vs. Lambda)

我将无服务器框架与无服务器离线插件一起使用。我一直在离线开发 AWS Lambda 函数,到目前为止还没有遇到很多大问题。

我需要做一个更复杂的SQL查询,所以我选择使用literal的方法写一些纯粹的SQL。我检查了日志,看到 Sequelize(使用 sequelize-typescript)正在为 table 名称分配别名,以便它们与模型名称匹配(或者在 table 关系的情况下,别名与键匹配关系被分配给了。所以我相应地写了我的 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
        `)
        ]
    },
});

再次澄清一下,在日志中我可以看到客户 table 被别名为“客户”,优惠券 table 被别名为“优惠券”。

我使用 serverless-offline 插件做了很多离线本地开发,只是把它放在 lambda 上......它不起作用。

它不起作用,因为出于某种原因,在 Lambda 上,相同的客户 table 被别名为“l”。如果我编辑我的硬编码查询以将客户 table 引用为“l”,那么它在 Lambda 上工作正常......但它停止离线工作,因为离线它被别名为“Customers”。

有没有办法强制 Sequelize 将 table 别名为某个名称?或者我可以做些什么来规范两个环境之间的名称?

我在输入问题时想到了这一点,所以我会继续写下答案。

问题是我的代码在部署为 Lambda 函数时被最小化了。 Here is the relevant documentation about minification and sequelize-typescript。最小化后,派生的 table 别名变为“l”​​(并在随后的尝试中变为“b”)。为了在最小化后强制 table 别名成为特定名称,您需要在制作模型时定义 modelName class。示例如下。

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

xyz 将成为 table 在生成的原始 SQL 中的别名。