web-dev-qa-db-ja.com

続編のモデルを自動生成する

Node.jsでmysqlのORMを可能にするモジュールであるSequelizeの使用を開始したいと思います。 CakePHPのようにモデルを自動生成することは可能かどうか疑問に思いました。 CakePHPでは、テーブルの情報を読み取り、モデル内のタイプとの関連付けとフィールドを自動的に作成します。一部のテーブルは比較的大きいため、すべてのテーブルを手作業で完全にマップする必要はありません。私のためにこれを行う何かがそこにありますか?それとも、すべてのモデルを手作業で入力するのは私だけですか?

11
LordZardeck

Sequelize-autoを使用してモデルを自動生成できます。次のリンクをたどってください https://github.com/sequelize/sequelize-auto

それはあなたのテーブルのモデルを生成します。

13
puneet gupta

Sequelizer-Sequelizeモデルを自動的かつ視覚的にエクスポートするデスクトップアプリケーション。

ElectronJSで作成された非常に印象的なGUIクライアント、ここを入手してください:ソース: https://github.com/andyforever/sequelizer

3
Junaid Atari

https://github.com/sequelize/sequelize/issues/339 を参照してください

Sequelizeは、データベースの既存のテーブル名を読み取るメソッドを提供します。さらに、テーブルの構造を読み取る方法があります。組み合わせると、モデルの作成を自動化できるはずです。

1
sdepold

モデルごとに 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ファイルを配置する特定のディレクトリ内のすべてのファイル(モデル)を取得します

構造は次のようになります。

structure

1
Andrey Tyndyk