【问题标题】:Resetting a Sequelize database重置 Sequelize 数据库
【发布时间】:2022-01-12 03:46:05
【问题描述】:

情况

我正在为一个使用 Sequelize + Postgres 的 Node.JS 项目编写集成测试。我想确保在运行测试之前完全重置测试数据库。

其他信息

  1. 我更喜欢通过 CLI + sequelize 完成的解决方案。
  2. 我不关心测试数据库的内容。
  3. 我不希望我的测试用户需要测试数据库之外的任何权限。

我有一个运行的pretest 脚本:

NODE_ENV=test yarn migrate

探索

我相信 db:dropdb:create 在 postgres 中不起作用。

在 Rails 中我可能会使用 db:migrate:reset

我知道 Sequelize 有 db:migrate:undo:all,但我相信它会单独回滚每个迁移,如果我的意图只是删除所有表,那感觉就像浪费时间。

问题

我如何最有效地完成从零开始在测试数据库上运行迁移的目标?

【问题讨论】:

    标签: node.js postgresql sequelize.js


    【解决方案1】:

    你应该使用Sequelize Command-Line Interface (CLI),然后你可以使用db:createdb:drop,无论你使用什么RDBMS。

    这里是用法,我用postgres:9.6测试一下:

    ☁  node-sequelize-examples [master] npx sequelize-cli db:drop
    
    Sequelize CLI [Node: 10.16.2, CLI: 5.5.1, ORM: 5.21.3]
    
    Loaded configuration file "src/config/config.js".
    Using environment "development".
    Executing (default): DROP DATABASE "node-sequelize-examples"
    Database node-sequelize-examples dropped.
    ☁  node-sequelize-examples [master] npx sequelize-cli db:create
    
    Sequelize CLI [Node: 10.16.2, CLI: 5.5.1, ORM: 5.21.3]
    
    Loaded configuration file "src/config/config.js".
    Using environment "development".
    Executing (default): CREATE DATABASE "node-sequelize-examples"
    Database node-sequelize-examples created.
    

    src/config/config.js:

    module.exports = {
      development: {
        username: process.env.POSTGRES_USER,
        password: process.env.POSTGRES_PASSWORD,
        database: process.env.POSTGRES_DB,
        host: process.env.POSTGRES_HOST,
        port: process.env.POSTGRES_PORT,
        dialect: 'postgres',
        logging: console.log,
      },
      test: {
        username: process.env.POSTGRES_USER,
        password: process.env.POSTGRES_PASSWORD,
        database: process.env.POSTGRES_DB,
        host: process.env.POSTGRES_HOST,
        port: process.env.POSTGRES_PORT,
        dialect: 'postgres',
      },
      production: {
        username: process.env.POSTGRES_USER,
        password: process.env.POSTGRES_PASSWORD,
        database: process.env.POSTGRES_DB,
        host: process.env.POSTGRES_HOST,
        port: process.env.POSTGRES_PORT,
        dialect: 'postgres',
      },
    };
    

    使用psql检查数据库:

    # psql -U testuser node-sequelize-examples
    psql (9.6.11)
    Type "help" for help.
    
    node-sequelize-examples=# \d
    No relations found.
    

    【讨论】:

    • 很好的建议;不幸的是,postgresql 似乎不支持这些 (ERROR: Dialect postgresql does not support db:create / db:drop commands)
    • db:createdb:drop 现已添加对 PostgreSQL 的支持。
    【解决方案2】:

    试试这个解决方案:

    同时使用 jest hook 预测试和多个步骤

    "pretest": "NODE_ENV=test sequelize db:migrate:undo:all && NODE_ENV=test sequelize db:drop && NODE_ENV=test sequelize db:create && NODE_ENV=test sequelize db:migrate,
    "test": "NODE_ENV=test jest"
    

    【讨论】:

    • 请为您的答案添加解释
    猜你喜欢
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 2021-03-15
    • 2015-05-29
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多