sequelize.js

sequelize.js - Secuela Crear Base de Datos



(4)

¿Hay alguna forma de secuelas para crear la base de datos a la que estoy intentando conectar si no existe?

Tengo una instancia de MySQL en bruto y recibo este error:

ER_BAD_DB_ERROR: Unknown database ''mytest''

Me gustaría manejar ese error, usar las credenciales que proporcioné (o un conjunto diferente de creaciones con permisos de creación) y ejecutar myATE de CREATE DATABASE.


En mi caso estaba usando sqlite, pero la idea era la misma. Necesitaba crear la base de datos primero con 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'', ... });


No tuve este problema con Postgresql pero sí con mysql. La solución fue crear un script pre-migrate y activarlo antes de la migración de secuencia, aquí hay parte de mi package.json :

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

y de manera similar a lo que se propuso en alguna respuesta aquí, puede crear este createDB.js usando módulos como node-postgres o mysql (o cualquier otro que se conecte a mysql con consultas en bruto):

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


Puede que tenga una solución razonable. Estoy seguro de que podría escribirse más limpio sin embargo.

Para este ejemplo, estoy usando Postgres, la respuesta sería ligeramente diferente para MySQL. Estoy tomando mucho dinero prestado de esta respuesta: node-postgres create database

En database.js tengo la siguiente función 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 }); }); };

La función init crea la base de datos antes de llamar a la secuencia. Primero abre una conexión a postgres y crea la base de datos. Si la base de datos ya existe, se generará un error que ignoraremos. Una vez que se crea, inicializamos la secuencia y la enviamos a la devolución de llamada. Es importante destacar que, si la base de datos ya existe, no se sobrescribirá.

En app.js recibo la instancia de la base de datos y la envío a cualquier módulo que la necesite, en este caso es un pasaporte.

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


Terminé usando el paquete mysql2 , aquí está lo que hice ...

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 }) })

Después de eso puedo conectarme a esa base de datos mediante la sequelize .