Mysql Sequelize-模型和迁移

Mysql Sequelize-模型和迁移,mysql,node.js,model,migration,sequelize.js,Mysql,Node.js,Model,Migration,Sequelize.js,[已解决!] 我在网上做了很多研究,发现了一些与我类似的问题。但是,我找不到解决问题的正确方法。请帮忙 我正在使用续集v6。我在使用模型和迁移时遇到了一些麻烦 我所做的: 我使用sequelize cli生成了角色模型。它在models/role.js中给出了下面的代码 "use strict"; const { Model } = require("sequelize"); module.exports = (sequelize, DataTypes)

[已解决!]

我在网上做了很多研究,发现了一些与我类似的问题。但是,我找不到解决问题的正确方法。请帮忙

我正在使用续集v6。我在使用模型和迁移时遇到了一些麻烦

我所做的:

我使用sequelize cli生成了角色模型。它在
models/role.js
中给出了下面的代码

"use strict";
const { Model } = require("sequelize");

module.exports = (sequelize, DataTypes) => {
  class Role extends Model {
    static associate(models) {
      // define association here
    }
  }

  Role.init(
    {
      name: DataTypes.STRING,
      description: DataTypes.STRING,   },
    {
      sequelize,
      modelName: "roles",
    }
  );

  return Role;
};
"use strict";

module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.createTable(
      "roles", // <- I've changed this from Roles to roles because I want the MySQL convention.
      {
        roleId: {
          allowNull: false,
          autoIncrement: true,
          field: "role_id",
          primaryKey: true,
          type: Sequelize.INTEGER,
        },
        name: {
          allowNull: false,
          type: Sequelize.STRING(30),
        },
        description: {
          type: Sequelize.STRING(50),
        },
        createdAt: {
          allowNull: false,
          field: "created_at",
          type: Sequelize.DATE,
        },
        updatedAt: {
          allowNull: false,
          field: "updated_at",
          type: Sequelize.DATE,
        },
      },
      {
        underscored: true,
      }
    );
  },

  down: async (queryInterface, Sequelize) => {
    await queryInterface.dropTable("roles");
  },
};
我还在
migrations/timestamp create role.js
中获得了该模型的migration文件

"use strict";
const { Model } = require("sequelize");

module.exports = (sequelize, DataTypes) => {
  class Role extends Model {
    static associate(models) {
      // define association here
    }
  }

  Role.init(
    {
      name: DataTypes.STRING,
      description: DataTypes.STRING,   },
    {
      sequelize,
      modelName: "roles",
    }
  );

  return Role;
};
"use strict";

module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.createTable(
      "roles", // <- I've changed this from Roles to roles because I want the MySQL convention.
      {
        roleId: {
          allowNull: false,
          autoIncrement: true,
          field: "role_id",
          primaryKey: true,
          type: Sequelize.INTEGER,
        },
        name: {
          allowNull: false,
          type: Sequelize.STRING(30),
        },
        description: {
          type: Sequelize.STRING(50),
        },
        createdAt: {
          allowNull: false,
          field: "created_at",
          type: Sequelize.DATE,
        },
        updatedAt: {
          allowNull: false,
          field: "updated_at",
          type: Sequelize.DATE,
        },
      },
      {
        underscored: true,
      }
    );
  },

  down: async (queryInterface, Sequelize) => {
    await queryInterface.dropTable("roles");
  },
};
我不好的地方

通过上面的实现,我在控制台上得到了这个错误

Executing (default): SELECT `id`, `name`, `description`, `createdAt`, `updatedAt` FROM `roles` AS `roles`;
SequelizeDatabaseError: Unknown column 'id' in 'field list'
    at Query.formatError (/home/hello-world/Thesis/SMS-API/node_modules/sequelize/lib/dialects/mysql/query.js:239:16)
    at Query.run (/home/hello-world/Thesis/SMS-API/node_modules/sequelize/lib/dialects/mysql/query.js:54:18)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
    at async /home/hello-world/Thesis/SMS-API/node_modules/sequelize/lib/sequelize.js:619:16
    at async MySQLQueryInterface.select (/home/hello-world/Thesis/SMS-API/node_modules/sequelize/lib/dialects/abstract/query-interface.js:938:12)
    at async Function.findAll (/home/hello-world/Thesis/SMS-API/node_modules/sequelize/lib/model.js:1741:21)
    at async /home/hello-world/Thesis/SMS-API/src/controllers/roles.js:5:17
    at async /home/hello-world/Thesis/SMS-API/src/middlewares/catchAsync.js:4:7
另一次尝试

我修改了
models/role.js
如下

Role.init(
    {
      role_id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: DataTypes.INTEGER,
      },
      name: DataTypes.STRING,
      description: DataTypes.STRING,
      created_at: DataTypes.DATE,
      updated_at: DataTypes.DATE,
    }
下一次尝试,下一次错误

通过上述修改,我得到了新的错误

Executing (default): SELECT `role_id`, `name`, `description`, `created_at`, `updated_at`, `createdAt`, `updatedAt` FROM `roles` AS `roles`;
SequelizeDatabaseError: Unknown column 'createdAt' in 'field list'
    at Query.formatError (/home/hello-world/Thesis/SMS-API/node_modules/sequelize/lib/dialects/mysql/query.js:239:16)
    at Query.run (/home/hello-world/Thesis/SMS-API/node_modules/sequelize/lib/dialects/mysql/query.js:54:18)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
    at async /home/hello-world/Thesis/SMS-API/node_modules/sequelize/lib/sequelize.js:619:16
    at async MySQLQueryInterface.select (/home/hello-world/Thesis/SMS-API/node_modules/sequelize/lib/dialects/abstract/query-interface.js:938:12)
    at async Function.findAll (/home/hello-world/Thesis/SMS-API/node_modules/sequelize/lib/model.js:1741:21)
    at async /home/hello-world/Thesis/SMS-API/src/controllers/roles.js:5:17
    at async /home/hello-world/Thesis/SMS-API/src/middlewares/catchAsync.js:4:7
帮助

我已经尝试了很多方法,但都不能解决我的问题。所以,请帮忙。我需要MySQL级别的MySQL命名约定,即
下划线
,以及代码级别的JavaScript命名约定


非常感谢。

我已经解决了我的问题。我现在可以为它们的特定世界使用每种命名约定:
对于MySQL,在_score下使用
;对于JavaScript,使用
camelCase

所以这里我写了我的解决方案,如果有人在未来遇到同样的问题

我正在使用
sequelize cli
创建迁移、模型和种子。你可以查一下

迁移

迁移只负责创建/更改/删除表和列仅使用数据库进行It访问。

migrations/timestamp create role table.js

const Role = require("../models").roles;
const catchAsync = require("../middlewares/catchAsync");

exports.findAll = catchAsync(async (req, res) => {
  const roles = await Role.findAll();

  return res.status(200).json({
    status: "success",
    data: {
      roles,
    },
  });
});
"use strict";

module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.createTable("roles", {
      roleId: {
        allowNull: false,
        autoIncrement: true,
        field: "role_id",
        primaryKey: true,
        type: Sequelize.INTEGER,
      },
      name: {
        allowNull: false,
        type: Sequelize.STRING(30),
      },
      description: {
        type: Sequelize.STRING(50),
      },
      createdAt: {
        allowNull: false,
        field: "created_at",
        type: Sequelize.DATE,
      },
      updatedAt: {
        allowNull: false,
        field: "updated_at",
        type: Sequelize.DATE,
      },
    });
  },

  down: async (queryInterface, Sequelize) => {
    await queryInterface.dropTable("roles");
  },
};

"use strict";

const roles = [
  "official",
  "office",
  "admin"
].map((role) => {
  return {
    name: role,
    created_at: new Date(),
    updated_at: new Date(),
  };
});

module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.bulkInsert("roles", roles);
  },

  down: async (queryInterface, Sequelize) => {
    await queryInterface.bulkDelete("roles", null, {});
  },
};
"use strict";
const { Model } = require("sequelize");

module.exports = (sequelize, DataTypes) => {
  class Role extends Model {
    static associate(models) {
      // define association here
    }
  }

  Role.init(
    {
      roleId: {
        allowNull: false,
        autoIncrement: true,
        field: "role_id", // SELECT role_id AS id
        primaryKey: true,
        type: DataTypes.INTEGER,
      },
      name: DataTypes.STRING,
      description: DataTypes.STRING,
      createdAt: {
        type: DataTypes.DATE,
        field: "created_at",
      },
      updatedAt: {
        type: DataTypes.DATE,
        field: "updated_at",
      },
    },
    {
      sequelize,
      tableName: "roles",
      modelName: "Role",
    }
  );

  return Role;
};
const models = require("../models");
const catchAsync = require("../middlewares/catchAsync");

exports.findAll = catchAsync(async (req, res) => {
  const roles = await models.Role.findAll();

  /*
  you can access 
    - role_id from db with roleId in JS
    - created_at from db with createdAt in JS
  */

  return res.status(200).json({
    status: "success",
    data: {
      roles,
    },
  });
});
通过运行上述迁移脚本,我在物理数据库中获得了包含以下列的
roles
表。
角色标识、名称、描述、创建时间、更新时间

播种机

Seeder将用初始测试数据填充您的表。我已经填写了我的
角色
表格,如下所示

Role.init(
    {
      role_id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: DataTypes.INTEGER,
      },
      name: DataTypes.STRING,
      description: DataTypes.STRING,
      created_at: DataTypes.DATE,
      updated_at: DataTypes.DATE,
    }
seeders/timestamp角色表seeder.js

const Role = require("../models").roles;
const catchAsync = require("../middlewares/catchAsync");

exports.findAll = catchAsync(async (req, res) => {
  const roles = await Role.findAll();

  return res.status(200).json({
    status: "success",
    data: {
      roles,
    },
  });
});
"use strict";

module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.createTable("roles", {
      roleId: {
        allowNull: false,
        autoIncrement: true,
        field: "role_id",
        primaryKey: true,
        type: Sequelize.INTEGER,
      },
      name: {
        allowNull: false,
        type: Sequelize.STRING(30),
      },
      description: {
        type: Sequelize.STRING(50),
      },
      createdAt: {
        allowNull: false,
        field: "created_at",
        type: Sequelize.DATE,
      },
      updatedAt: {
        allowNull: false,
        field: "updated_at",
        type: Sequelize.DATE,
      },
    });
  },

  down: async (queryInterface, Sequelize) => {
    await queryInterface.dropTable("roles");
  },
};

"use strict";

const roles = [
  "official",
  "office",
  "admin"
].map((role) => {
  return {
    name: role,
    created_at: new Date(),
    updated_at: new Date(),
  };
});

module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.bulkInsert("roles", roles);
  },

  down: async (queryInterface, Sequelize) => {
    await queryInterface.bulkDelete("roles", null, {});
  },
};
"use strict";
const { Model } = require("sequelize");

module.exports = (sequelize, DataTypes) => {
  class Role extends Model {
    static associate(models) {
      // define association here
    }
  }

  Role.init(
    {
      roleId: {
        allowNull: false,
        autoIncrement: true,
        field: "role_id", // SELECT role_id AS id
        primaryKey: true,
        type: DataTypes.INTEGER,
      },
      name: DataTypes.STRING,
      description: DataTypes.STRING,
      createdAt: {
        type: DataTypes.DATE,
        field: "created_at",
      },
      updatedAt: {
        type: DataTypes.DATE,
        field: "updated_at",
      },
    },
    {
      sequelize,
      tableName: "roles",
      modelName: "Role",
    }
  );

  return Role;
};
const models = require("../models");
const catchAsync = require("../middlewares/catchAsync");

exports.findAll = catchAsync(async (req, res) => {
  const roles = await models.Role.findAll();

  /*
  you can access 
    - role_id from db with roleId in JS
    - created_at from db with createdAt in JS
  */

  return res.status(200).json({
    status: "success",
    data: {
      roles,
    },
  });
});
型号

在我创建了表并填充了初始数据之后,我需要创建
Role
model,以便用作MySQL和JavaScript之间的桥梁

models/role.js

const Role = require("../models").roles;
const catchAsync = require("../middlewares/catchAsync");

exports.findAll = catchAsync(async (req, res) => {
  const roles = await Role.findAll();

  return res.status(200).json({
    status: "success",
    data: {
      roles,
    },
  });
});
"use strict";

module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.createTable("roles", {
      roleId: {
        allowNull: false,
        autoIncrement: true,
        field: "role_id",
        primaryKey: true,
        type: Sequelize.INTEGER,
      },
      name: {
        allowNull: false,
        type: Sequelize.STRING(30),
      },
      description: {
        type: Sequelize.STRING(50),
      },
      createdAt: {
        allowNull: false,
        field: "created_at",
        type: Sequelize.DATE,
      },
      updatedAt: {
        allowNull: false,
        field: "updated_at",
        type: Sequelize.DATE,
      },
    });
  },

  down: async (queryInterface, Sequelize) => {
    await queryInterface.dropTable("roles");
  },
};

"use strict";

const roles = [
  "official",
  "office",
  "admin"
].map((role) => {
  return {
    name: role,
    created_at: new Date(),
    updated_at: new Date(),
  };
});

module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.bulkInsert("roles", roles);
  },

  down: async (queryInterface, Sequelize) => {
    await queryInterface.bulkDelete("roles", null, {});
  },
};
"use strict";
const { Model } = require("sequelize");

module.exports = (sequelize, DataTypes) => {
  class Role extends Model {
    static associate(models) {
      // define association here
    }
  }

  Role.init(
    {
      roleId: {
        allowNull: false,
        autoIncrement: true,
        field: "role_id", // SELECT role_id AS id
        primaryKey: true,
        type: DataTypes.INTEGER,
      },
      name: DataTypes.STRING,
      description: DataTypes.STRING,
      createdAt: {
        type: DataTypes.DATE,
        field: "created_at",
      },
      updatedAt: {
        type: DataTypes.DATE,
        field: "updated_at",
      },
    },
    {
      sequelize,
      tableName: "roles",
      modelName: "Role",
    }
  );

  return Role;
};
const models = require("../models");
const catchAsync = require("../middlewares/catchAsync");

exports.findAll = catchAsync(async (req, res) => {
  const roles = await models.Role.findAll();

  /*
  you can access 
    - role_id from db with roleId in JS
    - created_at from db with createdAt in JS
  */

  return res.status(200).json({
    status: "success",
    data: {
      roles,
    },
  });
});
从JavaScript获取角色

controllers/roles.js

const Role = require("../models").roles;
const catchAsync = require("../middlewares/catchAsync");

exports.findAll = catchAsync(async (req, res) => {
  const roles = await Role.findAll();

  return res.status(200).json({
    status: "success",
    data: {
      roles,
    },
  });
});
"use strict";

module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.createTable("roles", {
      roleId: {
        allowNull: false,
        autoIncrement: true,
        field: "role_id",
        primaryKey: true,
        type: Sequelize.INTEGER,
      },
      name: {
        allowNull: false,
        type: Sequelize.STRING(30),
      },
      description: {
        type: Sequelize.STRING(50),
      },
      createdAt: {
        allowNull: false,
        field: "created_at",
        type: Sequelize.DATE,
      },
      updatedAt: {
        allowNull: false,
        field: "updated_at",
        type: Sequelize.DATE,
      },
    });
  },

  down: async (queryInterface, Sequelize) => {
    await queryInterface.dropTable("roles");
  },
};

"use strict";

const roles = [
  "official",
  "office",
  "admin"
].map((role) => {
  return {
    name: role,
    created_at: new Date(),
    updated_at: new Date(),
  };
});

module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.bulkInsert("roles", roles);
  },

  down: async (queryInterface, Sequelize) => {
    await queryInterface.bulkDelete("roles", null, {});
  },
};
"use strict";
const { Model } = require("sequelize");

module.exports = (sequelize, DataTypes) => {
  class Role extends Model {
    static associate(models) {
      // define association here
    }
  }

  Role.init(
    {
      roleId: {
        allowNull: false,
        autoIncrement: true,
        field: "role_id", // SELECT role_id AS id
        primaryKey: true,
        type: DataTypes.INTEGER,
      },
      name: DataTypes.STRING,
      description: DataTypes.STRING,
      createdAt: {
        type: DataTypes.DATE,
        field: "created_at",
      },
      updatedAt: {
        type: DataTypes.DATE,
        field: "updated_at",
      },
    },
    {
      sequelize,
      tableName: "roles",
      modelName: "Role",
    }
  );

  return Role;
};
const models = require("../models");
const catchAsync = require("../middlewares/catchAsync");

exports.findAll = catchAsync(async (req, res) => {
  const roles = await models.Role.findAll();

  /*
  you can access 
    - role_id from db with roleId in JS
    - created_at from db with createdAt in JS
  */

  return res.status(200).json({
    status: "success",
    data: {
      roles,
    },
  });
});
希望能有帮助