为续集自动生成模型

Posted

技术标签:

【中文标题】为续集自动生成模型【英文标题】:auto-generate models for sequelize 【发布时间】:2012-11-10 04:28:26 【问题描述】:

我想开始使用 Sequelize,这是一个允许在 node.js 中对 mysql 进行 ORM 的模块。我想知道是否可以像 Cakephp 那样自动生成模型。在 CakePHP 中,它将读取表的信息,并自动在模型中创建关联和字段及其类型。我真的很讨厌必须手工完全绘制出我所有的表格,因为有些表格相对较大。有什么东西可以为我做这件事吗?还是我一个人将所有模型都手动打出来?

【问题讨论】:

如果您只需要生成一次,可以使用github.com/sequelize/sequelize-auto 我在我的数据库(mysql)上尝试过,部分成功。它导入了结构(列和类型),但我必须手动添加键和关联。总比没有好。同样由于某种原因,它仅在我在本地主机(在数据库服务器上)上运行时才起作用。但这可能是由于某些防火墙等问题造成的。 【参考方案1】:

使用 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

【讨论】:

【参考方案2】:

现在您可以使用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

【讨论】:

关于sequelize-auto 的注释似乎已经过时了,因为截至今天,该项目在 23 天前进行了提交,而另一个项目在几个月前进行了最后一次提交。还有一个项目的贡献者是另一个项目的 20 倍。我不知道哪个效果更好,但是现在不维护 sequelize-auto 的断言似乎不正确。【参考方案3】:

您可以为每个模型使用sync 方法

示例:

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 文件

结构如下所示:

【讨论】:

他们想要相反的东西。从现有数据库生成模型文件。【参考方案4】:

Sequelizer - 一个桌面应用程序,用于自动、直观地导出续集模型。

使用 ElectronJS 制作的令人印象深刻的 GUI 客户端,请点击此处: 来源:https://github.com/andyforever/sequelizer

【讨论】:

Sequelizer 只是 sequelize-auto 的 GUI 前端。 Sequelizer-auto 的出色 GUI,我没有时间摆弄命令行,它一直给我错误,但是使用这个工具,它非常简单实用。好答案!【参考方案5】:

您可以通过 sequelize-auto 自动生成模型。只需点击以下链接 https://github.com/sequelize/sequelize-auto

它将为您的表格生成模型。

【讨论】:

但是你能告诉我如何保存关系(即外键信息)。 嗨 puneet gupta 请指导我如何在 db 中获取自动生成表。我从命令提示符处收到一条消息执行完成但是当我验证数据库内部没有创建任何内容时请指导@Puneet gupta 我坚持了两天以上 这是一个救生工具。如果您已经拥有数据库架构,请不要浪费时间使用 sequelize-cli 创建模型文件。【参考方案6】:

见https://github.com/sequelize/sequelize/issues/339

Sequelize 提供了读取数据库现有表名的方法。此外,还有一种读取表结构的方法。结合起来,应该可以自动创建模型。

【讨论】:

schaweet!谢谢。至少这为我自己创造了一种方式。

以上是关于为续集自动生成模型的主要内容,如果未能解决你的问题,请参考以下文章

如何创建这个始终作为带有续集的列生成的 tsvector?

nodejs续集加载嵌套模型

转换为 json 时续集下划线/蛇形大小写

在 MySql 数据库中将 primaryKey 续集为 UUID - 不起作用

[ES6深度解析]10:Generators 续集

续集在关联模型上的位置