自动生成Sequelize模型

29

我想开始使用Sequelize,这是一个允许在node.js中使用ORM的模块。我想知道是否可能像CakePHP一样自动生成模型。在CakePHP中,它会读取表的信息,并自动在模型中创建关联和字段及其类型。我真的不想完全手动映射所有的表,因为有些相对较大。是否有类似的工具可以帮助我完成这个过程?或者我只能自己手动键入所有的模型了?


如果您只需要生成一次,可以使用https://github.com/sequelize/sequelize-auto。我在我的DB(mysql)上尝试过,部分工作正常。它导入了结构(列和类型),但我必须手动添加键和关联。仍然比没有好。另外由于某些防火墙等问题,它只在本地主机(在db服务器上)运行时才有效。 - Lukas Lipavsky
8个回答

31

1
但是你能告诉我如何保存关系(即外键信息)吗? - maddy
嗨Puneet Gupta,请指导我如何在数据库中获取自动生成的表格。我从命令提示符收到了一条消息,执行完成。但是当我验证数据库时,里面没有任何创建的内容,请指导@Puneet Gupta,我已经卡了两天多了。 - SakthiSureshAnand
这是一个救命工具。如果您已经拥有数据库架构,请不要浪费时间使用sequelize-cli创建模型文件。 - Jeff

13
现在你可以使用 sequelize-automate 来自动生成模型。看起来 sequelize-auto 已经很久没有维护了,而且这个包已经过时了。
$ npm install sequelize-automate
$ ./node_modules/.bin/sequelize-automate --help

例如:

$ ./node_modules/.bin/sequelize-automate -t js -h localhost -d test -u root -p root -o models

3
关于 sequelize-auto 的注释似乎已经过时,因为截至今天该项目最近一次提交是23天前,而另一个项目的最近一次提交是几个月前。此外,一个项目的贡献者数量是另一个项目的20倍。我不知道哪一个更好,但声称 sequelize-auto 没有维护现在似乎是不正确的。 - David Boreham
现在到了2022年,sequelize-automate 距离上次提交和发布已经接近2年了。 - Charles L.

4

Sequelizer - 一款桌面应用程序,可以自动化地以图形方式导出sequelize模型。

这是使用ElectronJS制作的一个相当不错的GUI客户端,可以在此处获取: 源代码:https://github.com/andyforever/sequelizer


1
Sequelizer只是sequelize-auto的GUI前端。 - Onno
Sequelizer-auto的GREAT GUI非常棒,因为我没有时间在命令行上瞎折腾,它一直给我报错。但是有了这个工具,一切变得很容易和实用。答案很好! - Nassim

2
您可以为每个模型使用一个同步方法。
例如:
Object.keys(db).forEach((modelName) => {
    db[modelName].sync().then(result => {
       // some logic
    }).catch(err => {
       // some logic
    })
});

逻辑会在表不存在时创建一个新表。
完整脚本 index.js
'use strict';
const fs        = require("fs");
const path      = require("path");
const Sequelize = require("sequelize");

const sequelize = new Sequelize(process.env.DB_DATEBASE, process.env.DB_USER, process.env.DB_PASS, {
    host: process.env.DB_HOST,
    port: process.env.DB_PORT,
    dialect: 'mysql',
    operatorsAliases: false
});

const db = {};

fs
  .readdirSync(__dirname)
  .filter((file) => {
    return (file.indexOf(".") !== 0) && (file !== "index.js") && (file !== "migrations") && (file !== "redshift-migrations");
  })
  .forEach((file) => {
    const model = sequelize.import(path.join(__dirname, file));
    db[model.name] = model;
  });

Object.keys(db).forEach((modelName) => {
  if ("associate" in db[modelName]) {
    db[modelName].associate(db);
  }

  db[modelName].sync().then(result => {
    // some logic
  }).catch(err => {
    // some logic
  })
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

该脚本会获取指定目录中的所有文件(模型),您需要将index.js文件放置在该目录中。
目录结构如下:

structure


他们想要相反的。从现有数据库生成模型文件。 - Amr

2

使用npm install --save-dev sequelize-cli

使用npm install --save-dev sequelize-auto

使用npx sequelize-auto -o "./database/models" -d -h localhost -u root -p 3306 -x '' -e mysql命令


请详细说明或提供参考资料。 - Ankit

1

太好了!谢谢。至少这为我自己创建它们打开了一条道路。 - LordZardeck

1

0
从现有数据库创建自动模型的步骤。
使用node init创建一个新的节点项目。
使用npm安装sequelize-auto包。
npm install --save sequelize-auto

如果你的数据库是mysql
npm install --save mysql2

创建一个新文件(例如,generate-models.js),并引入所需的模块:
const SequelizeAuto = require('sequelize-auto');
const path = require('path');
const options = {
  dialect: 'mysql', // Replace with your database dialect (e.g., mysql, postgres, etc.)
  host: 'localhost',
  port: '3306', // Replace with your database port
  database: 'your_database_name', // Replace with your database name
  username: 'your_username', // Replace with your database username
  password: 'your_password', // Replace with your database password
  directory: path.resolve(__dirname, './models'), // Replace with the desired output directory for models
  additional: {
    timestamps: false, // Additional options for model generation (e.g., timestamps, underscored, etc.)
    underscored: true
  }
};
const auto = new SequelizeAuto(null, null, null, options);
auto.run(function (err) {
  if (err) throw err;
  console.log(auto.tables); // List of generated tables
});

保存文件并使用Node.js运行它:
node generate-models.js

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接