Crear base de datos en migración de KNEX -- sql campo con postgresql campo con migration campo con knex.js camp Relacionados El problema

Create database in Knex migration


8
vote

problema

Español

Pensé que sería una buena idea comenzar a usar las migraciones de la primera interacción de DB, así que me gustaría crear una migración para la creación de la base de datos.

knexfile.js

  'use strict';  require('dotenv').config({ path: 'process.env' });  const config =  {   client: 'pg',   connection: {     host: process.env.DB_URL,   }, };   module.exports = config;   

Archivo de migración:

  'use strict';  exports.up = function(knex, Promise) {   return knex.raw('CREATE DATABASE asd'); };  exports.down = function(knex, Promise) {   return knex.raw('DROP DATABASE asd'); };  exports.config = {   transaction: false };   

Funciona correctamente hasta este punto, pero cuando agrego database a la configuración de KNEXFILE, no logra migrar ya que KNEX intenta conectarse a la base de datos no existente.

También intenté usar una nueva instancia de KNEX para esta migración única como:

  exports.up = function(_, Promise) {   // Remove database from config so Knex won't try to connect   // to a non existing database.   const config = require(process.cwd() + '/knexfile');   config.connection.database = null;   const knex = require('knex')(config);    return knex.raw('CREATE DATABASE asd'); };   

Pero Knox ya está inicializado antes de la migración, por lo que falla con el mismo error:

  error: database "asd" does not exist   

¿Alguna idea sobre cómo crear la base de datos de una migración de KNEX? Estoy abierto a las mejores prácticas sobre la creación de la base de datos, que puede manejar las URL de DB para diferentes entornos.

Original en ingles

I thought it would be a good idea to start using migrations from the very first db interaction, so I'd like to create a migration for the database creation.

knexfile.js

'use strict';  require('dotenv').config({ path: 'process.env' });  const config =  {   client: 'pg',   connection: {     host: process.env.DB_URL,   }, };   module.exports = config; 

migration file:

'use strict';  exports.up = function(knex, Promise) {   return knex.raw('CREATE DATABASE asd'); };  exports.down = function(knex, Promise) {   return knex.raw('DROP DATABASE asd'); };  exports.config = {   transaction: false }; 

It works properly up to this point, but when I add database to the knexfile configuration, it fails to migrate as Knex tries to connect to the non existing database.

I also tried to use a new Knex instance for this single migration like:

exports.up = function(_, Promise) {   // Remove database from config so Knex won't try to connect   // to a non existing database.   const config = require(process.cwd() + '/knexfile');   config.connection.database = null;   const knex = require('knex')(config);    return knex.raw('CREATE DATABASE asd'); }; 

But knex is already initialized before the migration, so it fails with the same error:

error: database "asd" does not exist 

Any ideas about how to create the database from a Knex migration? I'm open to any best practices about database creation, that can handle db urls for different environments.

           

Lista de respuestas

9
 
vote

He añadido un script 'use strict'; async function createDatabase() { const config = require(process.cwd() + '/knexfile'); config.connection.database = null; const knex = require('knex')(config); await knex.raw('CREATE DATABASE asd'); await knex.destroy(); } createDatabase(); 5 a que ejecuta un script como este:

  'use strict';  async function createDatabase() {   const config = require(process.cwd() + '/knexfile');   config.connection.database = null;   const knex = require('knex')(config);    await knex.raw('CREATE DATABASE asd');   await knex.destroy(); }  createDatabase();   

De esta manera, no tengo este paso almacenado como una migración, pero realmente no veo un caso de uso en el que se gustaría dejar caer toda la base de datos.

¿Qué piensas de este enfoque?

 

I've added a postinstall script to that runs a script like this:

'use strict';  async function createDatabase() {   const config = require(process.cwd() + '/knexfile');   config.connection.database = null;   const knex = require('knex')(config);    await knex.raw('CREATE DATABASE asd');   await knex.destroy(); }  createDatabase(); 

This way I dont have this step stored as a migration, but I don't really see a use case where one would like to drop the whole database.

What do you think about this approach?

 
 
 
 
6
 
vote

KNEX no respalda realmente la creación de bases de datos fácilmente.

Primero de todas las migraciones en ejecución tiene que crear tabla, que contiene información de migraciones que se ha ejecutado, por lo que la base de datos debe existir las migraciones de ejecución previas.

Por lo general, le gustaría tener un archivo de configuración diferente para crear bases de datos, con el usuario con suficientes privilegios para crear bases de datos y que se conecta a E.G. Base de datos llamada postgres o template1 .

Así que debería poder hacerlo simplemente creando un script simple, lo que se asegura de que DB se crea antes de ejecutar las migraciones.

También hay herramienta knex-db-manager (escrito principalmente por mí) que podría ayudar a las tareas de crear usuarios / bases de datos del propietario de la base de datos.

 

Knex does not really support creating databases easily.

First of all running migrations has to create table, which contains information of migrations that has been ran, so database must exist prior executing migrations.

The usually you would like to have different configuration file for creating databases, with user with enough privileges to create databases and which connects to e.g. database called postgres or template1.

Like that you should be able to do just by creating simple script, which makes sure that DB is created before running the migrations.

Also there is tool knex-db-manager (written mostly by me) which might help tasks of creating database owner users / databases.

 
 
0
 
vote

Debido a que la base de datos no se conoce de antemano, la forma más fácil de hacerlo sería crear su propio script utilizando la API de migración. Debe ser posible especificar su nombre de base de datos dinámicamente

Guardar como length_b_loop <- length(dat_ftprints)-1 for (b in 1:length_b_loop){ if (b == 1){ spc_intersect_poly1 <- dat_ftprints[[b]] spc_intersect_poly2 <- dat_ftprints[[b+1]] spc_intersect_temp <- raster::intersect(spc_intersect_poly1, spc_intersect_poly2) } else { spc_intersect_poly3 <- dat_ftprints[[b+1]] spc_intersect_temp <- raster::intersect(spc_intersect_temp, spc_intersect_poly3) } } 0

  length_b_loop <- length(dat_ftprints)-1  for (b in 1:length_b_loop){   if (b == 1){     spc_intersect_poly1 <- dat_ftprints[[b]]     spc_intersect_poly2 <- dat_ftprints[[b+1]]     spc_intersect_temp <- raster::intersect(spc_intersect_poly1, spc_intersect_poly2)   } else {     spc_intersect_poly3 <- dat_ftprints[[b+1]]     spc_intersect_temp <- raster::intersect(spc_intersect_temp, spc_intersect_poly3)   } } 1111  

ahora puede ejecutar su script

  length_b_loop <- length(dat_ftprints)-1  for (b in 1:length_b_loop){   if (b == 1){     spc_intersect_poly1 <- dat_ftprints[[b]]     spc_intersect_poly2 <- dat_ftprints[[b+1]]     spc_intersect_temp <- raster::intersect(spc_intersect_poly1, spc_intersect_poly2)   } else {     spc_intersect_poly3 <- dat_ftprints[[b+1]]     spc_intersect_temp <- raster::intersect(spc_intersect_temp, spc_intersect_poly3)   } } 2  

Puede usar un archivo 'use strict'; async function createDatabase() { const config = require(process.cwd() + '/knexfile'); config.connection.database = null; const knex = require('knex')(config); await knex.raw('CREATE DATABASE asd'); await knex.destroy(); } createDatabase(); 13 para almacenar su configuración o pasarlos como argumentos de línea de comandos

 

Because the database is not known before hand, the easiest way to do this would be to create your own script using the migration API. It should be possible to specify your database name dynamically

Save as migrate.js

const Knex = require('knex')  // You can dynamically pass the database name // as a command-line argument, or obtain it from // a .env file const databaseName = 'database_name'  const connection = {   host: 'localhost',   user: 'root',   password: 'password' }  async function main() {   let knex = Knex({     client: 'mysql',     connection   })      // Lets create our database if it does not exist   await knex.raw('CREATE DATABASE IF NOT EXISTS ??', databaseName)       // Now that our database is known, let's create another knex object   // with database name specified so that we can run our migrations   knex = Knex({     client: 'mysql',     connection: {       ...connection,       database: databaseName,     }   })    // Now we can happily run our migrations   await knex.migrate.latest()    // Done!! }  main().catch(console.log).then(process.exit) 

You can now run your script

node migrate.js 

You can use a .env file to store your config or pass them as command-line arguments

 
 

Relacionados problema

4  Convertir la salida de Array_agg a la matriz y no la cadena  ( Convert array agg output to array and not string ) 
Estoy usando UISplitViewController0 para agrupar los valores en una matriz. La salida para la fila es: UISplitViewController111 Estoy tratando de hace...

1  KNEX - MYSQL ¿Cómo podría ejecutar múltiples declaraciones en una sola cadena de JavaScript?  ( Knex mysql how could i execute multiple statements in a single javascript stri ) 
Estoy tratando de llevar a cabo algunas instrucciones SQL dentro de mi archivo de migraciones usando KNEX. Para obtener más flexibilidad, me gustaría poner to...

15  Actualización por lotes en Knex  ( Batch update in knex ) 
Me gustaría realizar una actualización de lotes usando knex.js Por ejemplo: 'UPDATE foo SET [theValues] WHERE idFoo = 1' 'UPDATE foo SET [theValues] WH...

5  Destruyendo estantería / Piscina de conexión de Knox  ( Destroying bookshelf knex connection pool ) 
Tengo una API de DB que utiliza estantería / knox. Tengo múltiples modelos de estantería que parecen algo así: import bookshelf from '../bookshelf'; var...

0  Error de publicación cuando intento insertar datos en la base de datos con KNEX (NODE.JS)  ( Post error when i try to insert data into database with knex node js ) 
Básicamente, estoy tratando de agregar datos a mi base de datos con POST. No puedo averiguar dónde está mi error. Gracias de antemano por cualquier idea. M...

1  ¿Cómo caerse de promesas usando KNEX con la cláusula de conflicto?  ( How to chain promises using knex with the on conflict clause ) 
Tengo dos mesas 'Temp_Users' y 'Calificaciones' $CanonicalRequest = 'POST'." ". "/"." ". 'Action=GetSessionToken&amp;Version=2011-06-15&amp;Name=...

1  Cómo configurar las opciones SSL de conexión KNEX cuando use una cadena de conexión  ( How to set knex connection ssl options when using a connection string ) 
¿Cómo puedo configurar la propiedad SSL de mi conexión en realidad cuando estoy usando una cadena de conexión para inicializar KNEX? Del mismo modo, ¿cómo con...

0  ¿Por qué mi superusuario no se está autenticando en PSQL?  ( Why is my superuser failing to authenticate in psql ) 
Estoy intentando ejecutar una suite de prueba que incluya KNEX y PG, pero falla con este error: Knex:warning - Pool2 - Error: Pool was destroyed Knex:Error P...

2  ERROR: ENOENT: No hay tal archivo o directorio, Scandir '/ APP / MIGRACIONES'  ( Error enoent no such file or directory scandir app migrations ) 
tratando de ejecutar QListView111 en Heroku para configurar el DB, usando Nodo y PG y obtengo el siguiente error QListView2 y heres una copia de m...

1  Sintaxis para definir 'Pool' en Knex / Bookshelfjs  ( Syntax for defining pool in knex bookshelfjs ) 
En primer lugar, soy nuevo en todo aquí ... y nuevo a StackOverflow, así que disculpas por adelantado por ser un novato y estoy listo para mi paliza ... lol. ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos