【问题标题】:How can I drop all tables with Sequelize.js using postgresql?如何使用 postgresql 删除所有带有 Sequelize.js 的表?
【发布时间】:2015-04-09 16:59:13
【问题描述】:

我正在尝试:

if (process.NODE_ENV === 'test') {
  foreignKeyChecks = 0;
  forceSync = true;
} else {
  foreignKeyChecks = 1;
  forceSync = false;
}

global.db.sequelize.query("SET FOREIGN_KEY_CHECKS = " + foreignKeyChecks).then(function() {
  return global.db.sequelize.sync({
    force: forceSync
  });
}).then(function() {
  return global.db.sequelize.query('SET FOREIGN_KEY_CHECKS = 1');
}).then(function() {
  var server;
  console.log('Initialzed database on:');
  console.log(config.db);
  return server = app.listen(port, function() {
    return console.log("Server listening at http://" + (server.address().address) + ":" + (server.address().port));
  });
})["catch"](function(err) {
  return console.log('err', err);
});

module.exports = app;

但我得到:SequelizeDatabaseError: unrecognized configuration parameter "foreign_key_checks"

我假设我不能在 postgres 中使用该关键字?但是有没有等效的方法来删除所有表并重新创建?

【问题讨论】:

  • Postgres 中没有 foreign_key_checks 这样的选项。你在手册的哪里找到的?
  • 我认为不是。我从一些帖子中复制,我假设他们使用的是MySQL
  • 看来阅读手册真的是一门失传的艺术。

标签: postgresql sequelize.js


【解决方案1】:

这是一个更新的答案,针对像我一样在这里结束的谷歌员工。

Sequelize 提供 drop 功能:

drop(options) => promise

删除通过此 sequelize 实例定义的所有表。这是通过在每个模型上调用 Model.drop 来完成的。 Sequelize docs

示例

var sequelize = new Sequelize(config.database, config.username, config.password, config);

var someModel = sequelize.define('somemodel', {
  name: DataTypes.STRING
});

sequelize
  .sync() // create the database table for our model(s)
  .then(function(){
    // do some work
  })
  .then(function(){
    return sequelize.drop() // drop all tables in the db
  });

【讨论】:

    【解决方案2】:

    用于清除数据并从头开始重新创建所有数据(如在测试中):

    sequelize.sync({force: true});
    

    【讨论】:

    • 你错了。它不会删除存在于数据库中但不存在于 sequelize 模型列表中的表
    • Sequelize 也有 sequelize.truncate 为那些不想实际删除表的人截断所有表,它可能比 .sync 似乎做的 drop + recreate 更快:stackoverflow.com/a/66985334/895245
    【解决方案3】:

    我对那个 JavaScript 库一无所知,但 Postgres 提供了一个命令来删除用户拥有的所有内容:

    drop owned by <our_user_name cascade
    

    这只有在所有东西都归同一个用户所有并且该用户没有您不想想要删除的某些表(或视图、序列等)时才有效。

    手册中的更多详细信息:
    http://www.postgresql.org/docs/current/static/sql-drop-owned.html

    【讨论】:

    • 删除表时有什么方法可以关闭外键约束?
    • @Shamoon:你不需要。 cascade 关键字将自动删除所有外键。
    • 我意识到我不会need,但我正试图留在 ORM 的范围内
    【解决方案4】:

    对于任何寻找 sequelize-cli 解决方案的人,请查看此链接 Sequelize CLI:

    你可以运行:

    sequelize_cli db:drop
    
    sequelize_cli db:create
    

    使用 cli 工具创建或删除数据库。这样你就会有一个空的数据库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-21
      • 2011-03-20
      • 1970-01-01
      • 2012-10-24
      • 2015-10-03
      • 2022-01-15
      • 2010-12-14
      • 2012-08-18
      相关资源
      最近更新 更多