Sequelize 创建数据库

问题描述 投票:0回答:7

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

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

ER_BAD_DB_ERROR: Unknown database 'mytest'

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

sequelize.js
7个回答
25
投票

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

在这个例子中,我使用的是 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
        });
    });
};

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

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

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

10
投票

我最终使用了

mysql2
包,这就是我所做的..

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

之后我可以使用

sequelize
连接到该数据库。


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',
  ...
});

7
投票

我在 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);
    })
})

7
投票

简短地说: 就我而言,第一次运行测试时出现此错误。 为了解决这个问题,我只是在运行

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"
  },

0
投票

你可以尝试:

import { Sequelize } from 'sequelize';

// user must have permission to create databases.
const sequelize = new Sequelize('postgres://user:pass@localhost:5432/postgres');

async function creatDatabase(dbName: string) {
  let res;
  try {
    res = await sequelize.getQueryInterface().createDatabase(dbName);
  } catch(e) {
    console.log(e);
  }
  return res;
}

creatDatabase('secondDB');

0
投票

您可以在模型初始化之前使用 getQueryInterface 函数和 createaDabase 函数创建数据库.:

从“sequelize”导入{Sequelize};

让sequelizeOptions:any = { 方言:“mysql”, 主机:process.env.DB_HOST || “本地主机”, 端口:process.env.DB_PORT || 12345, 用户名:process.env.DB_USER || “根”, 密码:process.env.DB_PASSWORD || "", }

导出 const dataBase = async () => { // 如果数据库不存在则创建 const { 主机、端口、用户、密码、数据库 } = { 主机:process.env.DB_HOST,端口:process.env.DB_PORT,用户:process.env.DB_USER,密码:process.env.DB_PASSWORD,数据库:进程。 env.DB_NAME || “zconnectmarket”};

// const connection = await mysql.createConnection(({ host, port, user, password } as any));
// await connection.query(`CREATE DATABASE IF NOT EXISTS \`${database}\`;`);

// connect to db
const sequelizeCont = await new Sequelize((sequelizeOptions as any)).getQueryInterface().createDatabase(database);
// sync all models with database

return sequelizeCont;

}

导出默认的 new Sequelize(({ ...sequelizeOptions, 数据库: process.env.DB_NAME || "DBNAME" } as any))

© www.soinside.com 2019 - 2024. All rights reserved.