运行节点 server.js 和重新播种 db 时,表会被删除。续集

Posted

技术标签:

【中文标题】运行节点 server.js 和重新播种 db 时,表会被删除。续集【英文标题】:Tables getting dropped when running node server.js and re-seeding db. Sequelize 【发布时间】:2019-04-13 15:47:21 【问题描述】:

我遇到了一个错误,当我在节点中向我的数据库发出 get 请求时,我得到一个空数组。所以我查看了控制台日志,它说它正在删除所有表(如果存在)然后创建它们,但种子文件没有运行。我可以在服务器之外运行“npm run seed”,它会为数据库播种,但是当我运行 node server.js 时它会不断下降而不是播种。我什至尝试将种子的路径放在 packages.json “start”中:使种子和服务器都在启动时运行,但没有运气。该应用程序运行良好,但我的一个团队成员不小心推到了主人那里,它弄乱了应用程序,我不知道出了什么问题,因为这是在 git messup 之前工作的。我现在创建了一个新的仓库并遇到了同样的问题。

 //package.json
 "start": "node server.js ./seeds/seed-db.js"


    //seed-db.js
     const db = require("../models");
    const productSeeds = require("./seed-products.json");

     db.sequelize.sync( force: true ).then(function() 
      db.Market.bulkCreate([
     
  name: "Cotton Mill Farmers Market",
  address: "401 Rome St.",
  city: "Carrollton",
  state: "GA",
  zip: "30117"
 
    ]).then(function(dbMarkets) 
//COTTON MILL FARMERS MARKET STOCK
   dbMarkets[0].createProduct(productSeeds.broccoli).then(function() 
  db.sequelize.close();
   );


dbMarkets[1].createProduct(productSeeds.broccoli).then(function() 
 
  db.sequelize.close();
      );
       );
    );

//控制台

执行(默认):如果存在则删除表MarketProduct; 执行(默认):如果存在则删除表Product; 执行(默认):如果存在则删除表Markets; 执行(默认):如果存在则删除表Markets; 执行(默认): CREATE TABLE IF NOT EXISTS Markets (id INTEGER NOT NULL auto_increment , name VARCHAR(255), address VARCHAR(255), city VARCHAR(255), stateCHAR (255), zip 整数, 主键 (id)) 引擎=InnoDB; 执行(默认):SHOW INDEX FROM Markets FROM grocerEZ_db 执行(默认):如果存在则删除表Product; 执行(默认): CREATE TABLE IF NOT EXISTS Product (id INTEGER NOT NULL auto_increment , name VARCHAR(255), category ENUM('meat', 'fruits', 'vegetables', 'misc' ), isOrganic TINYINT(1), 主键 (id)) ENGINE=InnoDB; 执行(默认):SHOW INDEX FROM Product FROM grocerEZ_db 执行(默认):如果存在则删除表MarketProduct; 执行(默认): CREATE TABLE IF NOT EXISTS MarketProduct (createdAt DATETIME NOT NULL, updatedAtDATETIME NOT NULL, MarketId INTEGER , ProductId INTEGER , PRIMARY KEY (MarketId, ProductId)外键 (MarketId) 引用 Markets (id) 更新级联时删除级联,外键 (ProductId) 引用 Product (id) 更新级联时删除级联) 引擎=Inno; 执行(默认):SHOW INDEX FROM MarketProduct FROM grocerEZ_db 应用监听 PORT 3000

【问题讨论】:

【参考方案1】:

只是改变

db.sequelize.sync( force: true ) // <-- Forces table to drop and create again

db.sequelize.sync( force: false , alter : true )

DOC :

如果 force 为真,每个模型将在它之前运行 DROP TABLE IF EXISTS 尝试创建自己的表

更改表格以适应模型。不推荐用于生产用途。 删除列中已移除或类型已更改的数据 模型。


注意:

db.sequelize.sync ,这应该只运行一次,当你想 根据您所做的更改创建/修改表 模型,建议将其放在单独的文件中并在它运行时运行它 是必须的。

这是您应该通过检查连接而不是运行来运行查询的方式 同步,

db.sequelize
.authenticate()
.then(() => 
    console.log('Connection has been established successfully.');
)
.catch(err => 
    console.error('Unable to connect to the database:', err);
);

【讨论】:

我无法让它工作。如果存在,仍会删除表 @walkforr ,请确保 sync() 它没有写在其他任何地方,从所有地方删除它,如果你想保留它,让它 sync( force: false ) ,因为这是唯一的东西如果存在则使表下降。并在进行更改后重新启动服务器。 在我的代码中移动了几天后,您的解决方案奏效了。非常感谢。力:假。

以上是关于运行节点 server.js 和重新播种 db 时,表会被删除。续集的主要内容,如果未能解决你的问题,请参考以下文章

您如何使用具有多个突变的自定义文件正确播种 prisma DB?

Model Factory 和 Laravel 中的 DB 播种机有啥区别?

Laravel - 播种大型 SQL 文件

如何在修改后在节点js中重新加载项目

Laravel 4 db 种子特定播种器文件

在 laravel 7 中播种时无法截断表格