Как вставить несколько строк с помощью node.js , db-миграция, postgres

#node.js #postgresql #insert #migration #dbmigrate

#node.js #postgresql #вставить #миграция #dbmigrate

Вопрос:

У меня есть миграция ролей.

 'use strict';

var dbm;
var type;
var seed;

/**
  * We receive the dbmigrate dependency from dbmigrate initially.
  * This enables us to not have to rely on NODE_PATH.
  */
exports.setup = function (options, seedLink) {
  dbm = options.dbmigrate;
  type = dbm.dataType;
  seed = seedLink;
};

exports.up = function (db) {
  return db.createTable('roles', {
    role_id: { type: 'int', primaryKey: true, unique: true, autoIncrement: true },
    role_name: 'text',
  })
}

exports.down = function (db) {
  return db.dropTable('roles')
};

exports._meta = {
  "version": 1
};
  

Теперь я хотел бы установить некоторые роли по умолчанию. Как я предполагаю это сделать?

 'use strict';

var dbm;
var type;
var seed;

/**
  * We receive the dbmigrate dependency from dbmigrate initially.
  * This enables us to not have to rely on NODE_PATH.
  */

exports.setup = function (options, seedLink) {
  dbm = options.dbmigrate;
  type = dbm.dataType;
  seed = seedLink;
};

exports.up = function (db) {
  const sql = "DELETE FROM roles"
  db.runSql(sql, function (err) {
    if (err) return console.log(err)
  })

  return db.insert(
    'roles',
    ['user_role'],
    [['admin', 'technician']]
  )
};

exports.down = function (db) {
  const sql = "DELETE FROM roles"
  db.runSql(sql, function (err) {
    if (err) return console.log(err)
  })
  return null
};

exports._meta = {
  "version": 1
};
  

Независимо от того, что я пытаюсь, я всегда получаю

строка в кавычках, заключенная в кавычки, находится рядом с «‘admin);»

как ошибка.

Он запускается в контейнере docker, и я уже выполнял run migrate_up обе миграции

В документации указано, что мне нужно это сделать: insert(tableName, columnNameArray, valueArray, callback)

Итак, как мне добавить несколько строк в один оператор?

Ответ №1:

У меня была похожая проблема, мне удалось вставить их один за другим, поместить их обещания в массив, а затем вызвать promise all для них. итак, в вашем случае.

 exports.up = function (db) {
  const sql = "DELETE FROM roles"
  db.runSql(sql, function (err) {
    if (err) return console.log(err)
  })
  

  const promises = [];

  promises.push(db.insert('roles', { user_role : 'admin'}))
  promises.push(db.insert('roles', { user_role : 'technician'}))

  return Promise.all(promises)
};
  

Ответ №2:

Вот что я в итоге сделал. Надеюсь, это поможет кому-то еще

 'use strict'

var dbm
var type
var seed

/**
 * We receive the dbmigrate dependency from dbmigrate initially.
 * This enables us to not have to rely on NODE_PATH.
 */
exports.setup = function (options, seedLink) {
  dbm = options.dbmigrate
  type = dbm.dataType
  seed = seedLink
}

exports.up = function (db) {
  // If there are roles, we need to delete them anyway
  const sql = 'DELETE FROM roles'
  db.runSql(sql, function (err) {
    if (err) return console.log(err)
  })

  return db.insert('roles', ['role_name'], ['admin']).then(
    function (result) {
      return db.insert('roles', ['role_name'], ['technician'])
    },
    function (err) {
      if (err) return console.log(err)
    },
  )
}

exports.down = function (db) {
  const sql = 'DELETE FROM roles'
  db.runSql(sql, function (err) {
    if (err) return console.log(err)
  })
  return null
}

exports._meta = {
  version: 1,
}