【问题标题】:Sequelize Create DatabaseSequelize 创建数据库
【发布时间】:2015-09-26 11:24:34
【问题描述】:

如果我要连接的数据库不存在,有没有办法让 sequelize 创建它?

我有一个原始 MySQL 实例,但我得到了这个错误:

ER_BAD_DB_ERROR: Unknown database 'mytest'

我想处理该错误,使用我提供的凭据(或具有创建权限的不同创建集),然后运行 ​​CREATE DATABASE mytest。

【问题讨论】:

  • 我认为sequelize中没有这个功能,但我也想要一个这样的功能。没有什么比开始现有项目并需要在运行应用程序之前设置数据库更烦人的了。我不想让我的同事通过任何设置。下载并使用是必经之路。

标签: sequelize.js


【解决方案1】:

我可能有一个合理的解决方案。我相信它可以写得更干净。

对于这个示例,我使用的是 Postgres,对于 MySQL,答案会略有不同。我从这个答案中大量借用:node-postgres create database

在 database.js 中我有以下初始化函数

var Sequelize = require('sequelize'),
    pg = require('pg');

module.exports.init = function(callback) {
    var dbName = 'db_name',
        username = 'postgres',
        password = 'password',
        host = 'localhost'

    var conStringPri = 'postgres://' + username + ':' + password + '@' + host + '/postgres';
    var conStringPost = 'postgres://' + username + ':' + password + '@' + host + '/' + dbName;

    // connect to postgres db
    pg.connect(conStringPri, function(err, client, done) { 
        // create the db and ignore any errors, for example if it already exists.
        client.query('CREATE DATABASE ' + dbName, function(err) {
            //db should exist now, initialize Sequelize
            var sequelize = new Sequelize(conStringPost);
            callback(sequelize);
            client.end(); // close the connection
        });
    });
};

init 函数在调用sequelize 之前创建数据库。它首先打开与 postgres 的连接并创建数据库。如果数据库已经存在,则会抛出我们忽略的错误。创建后,我们初始化sequelize 并将其发送到回调。重要的是,如果数据库已经存在,它不会被覆盖。

在 app.js 中,我接收数据库实例并将其发送到需要它的任何模块,在本例中是护照。

require('./server/config/database.js').init(function(database) {
  require('./server/config/passport.js')(passport, database);
});

【讨论】:

  • 查看 node-pg 的好想法。我将检查 node-mysql 并查看是否存在类似的东西。如果有效,将返回并标记已回答。
  • 您说“如果数据库已经存在,则会抛出我们忽略的错误”。这是否意味着如果数据库已经存在,它将被覆盖?或者它只是被发现和使用?
  • @steven_noble 不,如果数据库已经存在,那么 CREATE DATABASE 会抛出一个错误告诉你。它不会覆盖现有的数据库。您可以使用虚拟数据库名称对此进行测试并注销错误以查看其内容和作用。
【解决方案2】:

很快: 就我而言,我在第一次运行测试时遇到了这个错误。 为了解决这个问题,我只是在运行jest 之前添加了命令npx sequelize-cli db:create


在我的test 脚本中添加命令后,package.json 如下所示:

  "scripts": {
    "test": "npx sequelize-cli db:create && jest"
  }

您应该在nmp test exexution 的开头看到此消息:

Loaded configuration file "config/config.json".
Using environment "development".
Database orders created.

Sequelize 知道创建一个名为“orders”的数据库,因为我在“config/config.json”中提到了它。

{
  "development": {
    "username": "root",
    "password": "pswd",
    "database": "manager",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "port": "3307"
  },

【讨论】:

  • 这是唯一对我有用的方法,从 Postgres 13 开始。谢谢!
  • 我无法使用命令 npx sequelize-cli db:create 创建数据库我做错了什么我刚刚安装了使用方言的 sequelize 是 postgres 。我正在运行第一个命令npx sequelize-cli init,之后我正在使用命令创建数据库,但它说`用户“migrationRoot”的密码身份验证失败`
  • 表示用户名或密码错误。用户/密码通常在您设置数据库或其容器时确定@Harpritsingh
  • 实际上经过两天的搜索,我在 sequelize 中发现它不支持创建和删除看到这个github.com/sequelize/sequelize/issues/8082)@KernelMode
【解决方案3】:

我在使用 Postgresql 时没有这个问题,但我在使用 mysql 时确实遇到了这个问题。 解决方案是创建一个pre-migrate 脚本并在续集迁移之前触发它,这是我的package.json 的一部分:

"db:pre-migrate": "node scripts/createDB.js",
"db:migrate": "npm run db:pre-migrate && node_modules/.bin/sequelize db:migrate",

与此处某些答案中提出的类似,您可以使用 node-postgresmysql(或通过原始查询连接到 mysql 的任何其他模块)之类的模块创建此 createDB.js

const mysql = require('mysql2/promise');

const dbName = process.env.DB_SCHEMAS || "YOUR_DB";

mysql.createConnection({
    host: process.env.DB_HOST || "127.0.0.1",
    port: process.env.DB_PORT || "3306",
    user     : process.env.DB_USER || "root",
    password : process.env.DB_PASSWORD || "root",
}).then( connection => {
    connection.query(`CREATE DATABASE IF NOT EXISTS ${dbName};`).then((res) => {
        console.info("Database create or successfully checked");
        process.exit(0);
    })
})

【讨论】:

    【解决方案4】:

    我最终使用了mysql2 包,这就是我所做的......

    const mysql = require('mysql2/promise');
    
    mysql.createConnection({
        user     : config.sequelize.username,
        password : config.sequelize.password
    }).then(() => {
        connection.query('CREATE DATABASE IF NOT EXISTS myRandomDb;').then(() => {
            // Safe to use sequelize now
        })
    })
    

    之后我可以使用sequelize 连接到该数据库。

    【讨论】:

      【解决方案5】:

      就我而言,我使用的是 sqlite,但想法是一样的。我需要先用sqlite3 创建数据库。

      const sqlite = require('sqlite3');
      const db = new sqlite.Database('/path/to/database.sqlite');
      const sequelize = new Sequelize('database', '', '', {
        dialect: 'sqlite',
        storage: '/path/to/database.sqlite',
        ...
      });
      

      【讨论】:

      • 我没有从 sequelize 6.14.0 复制测试,sequelize 确实在那里为我创建了数据库。
      猜你喜欢
      • 2018-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-30
      • 2016-05-27
      • 1970-01-01
      • 2020-12-07
      • 2021-06-02
      相关资源
      最近更新 更多