Sequelize 中的 .sync() 到底是为了啥?

Posted

技术标签:

【中文标题】Sequelize 中的 .sync() 到底是为了啥?【英文标题】:What is really .sync() in Sequelize for?Sequelize 中的 .sync() 到底是为了什么? 【发布时间】:2018-10-25 19:19:51 【问题描述】:

总的来说,我是 Sequelize 和 Node.js 的新手,我想知道除了在开发阶段创建和构建数据库以完全适合您的项目之外,是否还需要 .sync()。

举个例子:如果我已经有了我的数据库结构(用 MySQL Workbench 或其他什么),那么使用 .sync() 是否有用?它在生产中有什么重要的应用吗?

【问题讨论】:

@AbhinavD 涵盖了它,但要重申:sync 永远不会在真实数据库上使用。您应该只使用迁移。但是,sync 对测试非常有价值!这是确保您的测试套件在干净的数据库上运行的一种简单方法。 好点@mcranston18。在运行我们的测试之前,我们主要运行我们的迁移down 然后up。这使我们有优势确保我们的down 迁移也正常工作。万一我们不得不回滚生产,这真的很方便 【参考方案1】:

如果我已经有了我的数据库结构(使用 mysql Workbench 或 无论如何),使用.sync()是否有用?有没有 生产中的重要应用?

没有。 Sequelize sync 将创建不存在的表。如果您已经拥有所有表格,它不会做任何事情。但是,如果您使用force: true,它将删除存在的表并从模型定义中重新创建它们。

另外,人们应该更喜欢migrations 而不是syncsync 不反映故事变化。迁移功能更强大,您可以使用它撤消、重做等等。

这是Sequelize.js: how to use migrations and sync的一个很好的答案

【讨论】:

【参考方案2】:

sequelize.sync() 为所有已定义的模型创建表(即,在 Sequelize 实例上使用 define 方法)。它通过创建适当的表和关系(如果适用)将模型同步到数据库。

例子:

sequelize
  .sync()
  .then(result => 
    console.log(result);
  )
  .catch(err => console.log(err));

这是控制台日志开头的内容(“产品”表是基于“产品”模型创建的;它会自动复数):

Executing (default): CREATE TABLE IF NOT EXISTS `products` (`id` INTEGER NOT NULL auto_increment , `title` VARCHAR(255), `price` DOUBLE PRECISION NOT NULL, `imageUrl` VARCHAR(255) NOT NULL, `description` VARCHAR(255) NOT NULL, `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;

【讨论】:

以上是关于Sequelize 中的 .sync() 到底是为了啥?的主要内容,如果未能解决你的问题,请参考以下文章

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

Sequelize model.sync() 抛出错误

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

Sequelize sync() 不会创建所有的表模型

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

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