运行节点 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), state
CHAR (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, updatedAt
DATETIME 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?