为啥 sequelize.sync() 不同步表,除非我将模态导入文件?

Posted

技术标签:

【中文标题】为啥 sequelize.sync() 不同步表,除非我将模态导入文件?【英文标题】:why sequelize.sync() is not syncing the table unless i import the modals into the file?为什么 sequelize.sync() 不同步表,除非我将模态导入文件? 【发布时间】:2021-07-16 08:15:31 【问题描述】:

我正在使用带有 sequelize 的 postgres。我正在尝试在数据库中创建一个 Products 表。在主脚本文件 (app.js) 上,我调用了 sequelize.sync() 以将模式与数据库同步。但是,无论我尝试了多少次,该表都没有在数据库中创建。唯一执行的查询是这个;

Executing (default): SELECT 1+1 AS result

但是,当我将模式导入 app.js 文件时,同步会正常进行。我真的对这种行为感到困惑。

这些是我的文件;

./utils/database.js

const  Sequelize  = require("sequelize");

module.exports = new Sequelize("mydatabase", "myname", "mypassword", 
  host: "localhost",
  dialect: "postgres",
  operatorsAliases: false,

  pool: 
    max: 5,
    min: 0,
    acquire: 30000,
    idle: 10000,
  ,
);

./modals/product.js

const  Sequelize, DataTypes  = require("sequelize");

const sequelize = require("../utils/database.js");

const Product = sequelize.define("Product", 
  id: 
    type: DataTypes.UUID,
    defaultValue: Sequelize.UUIDV4,
    allowNull: false,
    primaryKey: true,
  ,
  title: 
    type: DataTypes.STRING,
  ,
  price: 
    type: DataTypes.DOUBLE,
    allowNull: false,
  ,
  imageUrl: 
    type: DataTypes.STRING,
  ,
  description: 
    type: DataTypes.STRING,
  ,
);

// export the Modal
module.exports = Product;

./app.js

const sequelize = require("./utils/database.js");

sequelize.sync()
  .then(() => 

    // listen
    app.listen(3000, () => 
      console.log("Server running...");
    );

    
  )
  .catch((error) => 
    console.log(error);
  );

以上代码同步失败。但是如果我将模态导入到这个文件中,它工作正常。

const sequelize = require("./utils/database.js");

// importing Product modal
const Product = require("./models/product.js");

    
    sequelize.sync()
      .then(() => 
    
        // listen
        app.listen(3000, () => 
          console.log("Server running...");
        );
    
        
      )
      .catch((error) => 
        console.log(error);
      );

如果要使用sync()函数,是否总是需要将所有modals导入到app.js文件中?

【问题讨论】:

【参考方案1】:

稍微改变你的文件结构,尝试如下

./utils/database.js

const  Sequelize  = require("sequelize");

const sequelize = new Sequelize("mydatabase", "myname", "mypassword", 
  host: "localhost",
  dialect: "postgres",
  operatorsAliases: false,

  pool: 
    max: 5,
    min: 0,
    acquire: 30000,
    idle: 10000,
  ,
);

const db = ;

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

module.exports = db;

./modals/product.js

const  DataTypes  = require("sequelize");

const db = require("../utils/database.js");

const Product = db.sequelize.define("Product", 
  id: 
    type: DataTypes.UUID,
    defaultValue: db.Sequelize.UUIDV4,
    allowNull: false,
    primaryKey: true,
  ,
  title: 
    type: DataTypes.STRING,
  ,
  price: 
    type: DataTypes.DOUBLE,
    allowNull: false,
  ,
  imageUrl: 
    type: DataTypes.STRING,
  ,
  description: 
    type: DataTypes.STRING,
  ,
);

// export the Modal
module.exports = Product;

【讨论】:

含糊不清,根本没有提供解释。请在你的回答中更彻底,并提出一个观点。

以上是关于为啥 sequelize.sync() 不同步表,除非我将模态导入文件?的主要内容,如果未能解决你的问题,请参考以下文章

node-sequelize学习笔记二(创建删除表安全检查表表列的数据类型)

Sequelize .sync 函数挂起:来自 serial.klass 的发射器

如何停止执行(默认):DROP TABLE IF EXISTS in sequelize sync

如何在 MySql 中使用 sequelize 运行多个原始查询?

如何将 sequelize.sync 选项强制设置为 false?

Sqlite外键不匹配sequelize迁移