有没有办法让sequelize创建我试图连接的数据库,如果它不存在?
我有一个原始的MySQL实例,我收到了这个错误:
ER_BAD_DB_ERROR: Unknown database 'mytest'
我想处理该错误,使用我提供的信用(或使用创建权限创建不同的创建集),然后运行CREATE DATABASE mytest。
答案 0 :(得分:20)
我可能有一个合理的解决方案。我相信它可以写得更干净。
对于这个例子,我使用的是Postgres,MySQL的答案略有不同。我大量借用这个答案:node-postgres create database
在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
});
});
};
init函数在调用sequelize之前创建数据库。它首先打开与postgres的连接并创建数据库。如果数据库已经存在,则会抛出一个我们忽略的错误。一旦创建,我们初始化sequelize并将其发送到回调。重要的是,如果数据库已存在,则不会被覆盖。
在app.js中,我收到数据库实例,并将其发送给需要它的模块,在这种情况下,它是护照。
require('./server/config/database.js').init(function(database) {
require('./server/config/passport.js')(passport, database);
});
答案 1 :(得分:4)
在我的情况下,我使用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',
...
});
答案 2 :(得分:2)
我最终使用了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
连接到该数据库。
答案 3 :(得分:2)
不久:
就我而言,我在第一次运行测试时遇到了这个错误。
为了解决这个问题,我只是在运行 npx sequelize-cli db:create
之前添加了命令 jest
。
在我的 test
脚本中添加命令后,package.json 如下所示:
"scripts": {
"test": "npx sequelize-cli db:create && jest"
}
您应该在 nmp test
执行的开始时看到此消息:
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"
},
答案 4 :(得分:1)
我在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",
类似于在此处的某些答案中所建议的,您可以使用createDB.js
或node-postgres
之类的模块(或任何其他通过原始查询连接到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);
})
})