Sequelize创建数据库

Dav*_*and 24 sequelize.js

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

我有一个原始的MySQL实例,我收到此错误:

ER_BAD_DB_ERROR: Unknown database 'mytest'
Run Code Online (Sandbox Code Playgroud)

我想处理这个错误,使用我提供的信用(或使用创建权限创建一组不同的创建),然后运行CREATE DATABASE mytest.

Spe*_*cer 21

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

对于这个例子,我使用的是Postgres,MySQL的答案略有不同.我从这个答案中大量借用:node-postgres创建数据库

在database.js中,我有以下init函数

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
        });
    });
};
Run Code Online (Sandbox Code Playgroud)

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

在app.js中,我收到数据库实例并将其发送给需要它的模块,在这种情况下它是护照.

require('./server/config/database.js').init(function(database) {
  require('./server/config/passport.js')(passport, database);
});
Run Code Online (Sandbox Code Playgroud)


Gra*_*ant 7

就我而言,我使用的是 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',
  ...
});
Run Code Online (Sandbox Code Playgroud)


小智 7

我用 Postgresql 没有这个问题,但我用 mysql 有这个问题。解决方案是创建一个pre-migrate脚本并在 sequelize 迁移之前触发它,这是我的一部分package.json

"db:pre-migrate": "node scripts/createDB.js",
"db:migrate": "npm run db:pre-migrate && node_modules/.bin/sequelize db:migrate",
Run Code Online (Sandbox Code Playgroud)

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

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);
    })
})
Run Code Online (Sandbox Code Playgroud)


Ker*_*ode 7

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


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

  "scripts": {
    "test": "npx sequelize-cli db:create && jest"
  }
Run Code Online (Sandbox Code Playgroud)

您应该在执行开始时看到此消息nmp test

Loaded configuration file "config/config.json".
Using environment "development".
Database orders created.
Run Code Online (Sandbox Code Playgroud)

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

{
  "development": {
    "username": "root",
    "password": "pswd",
    "database": "manager",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "port": "3307"
  },
Run Code Online (Sandbox Code Playgroud)


nik*_*san 5

我最终使用了该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
    })
})
Run Code Online (Sandbox Code Playgroud)

之后,我可以使用sequelize.