javascript - 我想要 Sequelize 形式的这个查询

标签 javascript sql node.js sequelize.js sequelize-typescript

我在 RAW SQL 中获得输出,但我无法使用 SequelizeJS

SELECT * FROM `tbl_a` a 
LEFT JOIN `tbl_b` b on b.b_uuid = a.a_uuid
LEFT JOIN `tbl_c` c on c.c_uuid = a.a_uuid

最佳答案

我假设这些表的关系是这样的:

  • tbl_atbl_b :一对一关系
  • tbl_atbl_c :一对一关系

  • Sequelize 版本:"sequelize": "^5.21.3"
    /* eslint-disable @typescript-eslint/camelcase */
    import { sequelize } from '../../db';
    import { Model, DataTypes } from 'sequelize';
    
    class TblA extends Model {}
    TblA.init(
      {
        a_uuid: {
          type: DataTypes.UUID,
          defaultValue: DataTypes.UUIDV4,
          primaryKey: true,
        },
      },
      { sequelize, modelName: 'tbl_a' },
    );
    
    class TblB extends Model {}
    TblB.init(
      {
        b_uuid: {
          type: DataTypes.UUID,
          defaultValue: DataTypes.UUIDV4,
        },
      },
      { sequelize, modelName: 'tbl_b' },
    );
    
    class TblC extends Model {}
    TblC.init(
      {
        c_uuid: {
          type: DataTypes.UUID,
          defaultValue: DataTypes.UUIDV4,
        },
      },
      { sequelize, modelName: 'tbl_c' },
    );
    
    TblA.hasOne(TblB, { foreignKey: 'b_uuid', sourceKey: 'a_uuid', as: 'b' });
    TblB.belongsTo(TblA, { foreignKey: 'b_uuid', targetKey: 'a_uuid' });
    
    TblA.hasOne(TblC, { foreignKey: 'c_uuid', sourceKey: 'a_uuid', as: 'c' });
    TblC.belongsTo(TblA, { foreignKey: 'c_uuid', targetKey: 'a_uuid' });
    
    (async function test() {
      try {
        await sequelize.sync({ force: true });
        // seed
        await TblA.create(
          {
            b: {},
            c: {},
          },
          {
            include: [
              { model: TblB, as: 'b' },
              { model: TblC, as: 'c' },
            ],
          },
        );
    
        // test
        const result = await TblA.findAll({
          include: [
            { model: TblB, as: 'b', required: false },
            { model: TblC, as: 'c', required: false },
          ],
          raw: true,
        });
        console.log(result);
      } catch (error) {
        console.log(error);
      } finally {
        await sequelize.close();
      }
    })();
    

    执行结果:

    Executing (default): DROP TABLE IF EXISTS "tbl_c" CASCADE;
    Executing (default): DROP TABLE IF EXISTS "tbl_b" CASCADE;
    Executing (default): DROP TABLE IF EXISTS "tbl_a" CASCADE;
    Executing (default): DROP TABLE IF EXISTS "tbl_a" CASCADE;
    Executing (default): CREATE TABLE IF NOT EXISTS "tbl_a" ("a_uuid" UUID , PRIMARY KEY ("a_uuid"));
    Executing (default): SELECT i.relname AS name, ix.indisprimary AS primary, ix.indisunique AS unique, ix.indkey AS indkey, array_agg(a.attnum) as column_indexes, array_agg(a.attname) AS column_names, pg_get_indexdef(ix.indexrelid) AS definition FROM pg_class t, pg_class i, pg_index ix, pg_attribute a WHERE t.oid = ix.indrelid AND i.oid = ix.indexrelid AND a.attrelid = t.oid AND t.relkind = 'r' and t.relname = 'tbl_a' GROUP BY i.relname, ix.indexrelid, ix.indisprimary, ix.indisunique, ix.indkey ORDER BY i.relname;
    Executing (default): DROP TABLE IF EXISTS "tbl_b" CASCADE;
    Executing (default): CREATE TABLE IF NOT EXISTS "tbl_b" ("id"   SERIAL , "b_uuid" UUID REFERENCES "tbl_a" ("a_uuid") ON DELETE CASCADE ON UPDATE CASCADE, PRIMARY KEY ("id"));
    Executing (default): SELECT i.relname AS name, ix.indisprimary AS primary, ix.indisunique AS unique, ix.indkey AS indkey, array_agg(a.attnum) as column_indexes, array_agg(a.attname) AS column_names, pg_get_indexdef(ix.indexrelid) AS definition FROM pg_class t, pg_class i, pg_index ix, pg_attribute a WHERE t.oid = ix.indrelid AND i.oid = ix.indexrelid AND a.attrelid = t.oid AND t.relkind = 'r' and t.relname = 'tbl_b' GROUP BY i.relname, ix.indexrelid, ix.indisprimary, ix.indisunique, ix.indkey ORDER BY i.relname;
    Executing (default): DROP TABLE IF EXISTS "tbl_c" CASCADE;
    Executing (default): CREATE TABLE IF NOT EXISTS "tbl_c" ("id"   SERIAL , "c_uuid" UUID REFERENCES "tbl_a" ("a_uuid") ON DELETE CASCADE ON UPDATE CASCADE, PRIMARY KEY ("id"));
    Executing (default): SELECT i.relname AS name, ix.indisprimary AS primary, ix.indisunique AS unique, ix.indkey AS indkey, array_agg(a.attnum) as column_indexes, array_agg(a.attname) AS column_names, pg_get_indexdef(ix.indexrelid) AS definition FROM pg_class t, pg_class i, pg_index ix, pg_attribute a WHERE t.oid = ix.indrelid AND i.oid = ix.indexrelid AND a.attrelid = t.oid AND t.relkind = 'r' and t.relname = 'tbl_c' GROUP BY i.relname, ix.indexrelid, ix.indisprimary, ix.indisunique, ix.indkey ORDER BY i.relname;
    Executing (default): INSERT INTO "tbl_a" ("a_uuid") VALUES ($1) RETURNING *;
    Executing (default): INSERT INTO "tbl_b" ("id","b_uuid") VALUES (DEFAULT,$1) RETURNING *;
    Executing (default): INSERT INTO "tbl_c" ("id","c_uuid") VALUES (DEFAULT,$1) RETURNING *;
    Executing (default): SELECT "tbl_a"."a_uuid", "b"."id" AS "b.id", "b"."b_uuid" AS "b.b_uuid", "c"."id" AS "c.id", "c"."c_uuid" AS "c.c_uuid" FROM "tbl_a" AS "tbl_a" LEFT OUTER JOIN "tbl_b" AS "b" ON "tbl_a"."a_uuid" = "b"."b_uuid" LEFT OUTER JOIN "tbl_c" AS "c" ON "tbl_a"."a_uuid" = "c"."c_uuid";
    [ { a_uuid: '1c9cf677-baa9-48c8-ac9b-3e617980c046',
        'b.id': 1,
        'b.b_uuid': '1c9cf677-baa9-48c8-ac9b-3e617980c046',
        'c.id': 1,
        'c.c_uuid': '1c9cf677-baa9-48c8-ac9b-3e617980c046' } ]
    

    sequelize生成的SQL为:

    SELECT 
      "tbl_a"."a_uuid", 
      "b"."id" AS "b.id", 
      "b"."b_uuid" AS "b.b_uuid", 
      "c"."id" AS "c.id", 
      "c"."c_uuid" AS "c.c_uuid" 
    FROM "tbl_a" AS "tbl_a" 
    LEFT OUTER JOIN "tbl_b" AS "b" ON "tbl_a"."a_uuid" = "b"."b_uuid" 
    LEFT OUTER JOIN "tbl_c" AS "c" ON "tbl_a"."a_uuid" = "c"."c_uuid";
    

    数据库中的数据记录:

    node-sequelize-examples=# select * from tbl_a;
                    a_uuid
    --------------------------------------
     9d982af2-0ee6-407e-93ee-d9d404178756
    (1 row)
    
    node-sequelize-examples=# select * from tbl_b;
     id |                b_uuid
    ----+--------------------------------------
      1 | 9d982af2-0ee6-407e-93ee-d9d404178756
    (1 row)
    
    node-sequelize-examples=# select * from tbl_c;
     id |                c_uuid
    ----+--------------------------------------
      1 | 9d982af2-0ee6-407e-93ee-d9d404178756
    (1 row)
    

    关于javascript - 我想要 Sequelize 形式的这个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59303325/

    相关文章:

    sql - 在此 SQL 查询中进行多连接的更好方法?

    mysql - 使用 Node.js 和 MySQL 进行两个查询和循环

    javascript - 玩!框架从 Javascript 访问 Play 变量

    javascript - 鼠标悬停时附加事件监听器

    javascript - 修改现有 Shopify 主题与从头开始构建

    javascript - node_modules 包导入时出现意外标识符

    javascript - 将 Mongoose 对象添加到nodejs中的数组

    javascript - Set() 作为 Javascript 对象的键

    mysql - 只选择表中重复的行

    jquery - 如何在jQuery中遍历Grails映射