как динамически вставить несколько строк в облачный гаечный ключ Google - PullRequest
0 голосов
/ 21 декабря 2018

В следующем фрагменте кода: вставка нескольких строк со статическими значениями.Как динамически вставить несколько строк в базу данных гаечного ключа в одной транзакции?

 function writeUsingDml(instanceId, databaseId, projectId) {

  const {Spanner} = require('@google-cloud/spanner');

  const spanner = new Spanner({
      projectId: projectId,
  });

   const instance = spanner.instance(instanceId);
   const database = instance.database(databaseId);

  database.runTransaction(async (err, transaction) => {
     if (err) {
        console.error(err);
       return;
    }
try {
  const rowCount = await transaction.runUpdate({
    sql: `INSERT Singers (SingerId, FirstName, LastName) VALUES
    (12, 'Melissa', 'Garcia'),
    (13, 'Russell', 'Morales'),
    (14, 'Jacqueline', 'Long'),
    (15, 'Dylan', 'Shaw')`,
  });
  console.log(`${rowCount} records inserted.`);
  await transaction.commit();
} catch (err) {
  console.error('ERROR:', err);
} finally {
   database.close();
 }
});
}

Сейчас я динамически вставляю одну строку следующим образом и хочу расширить ее до нескольких строк

 var sqlString = "Insert " + tName
 var cNames = "( "
 var cValues = "( "
 for(var col in cols) {
   cNames = cNames +  col +  ", " ;
   const cValue = cols[col];
   if (typeof cValue == 'string' || cValue instanceof String){
     cValues = cValues + "'" + cValue + "', "
   }else{
     cValues = cValues + cValue + ", ";
   }
  }
   return sqlString + cNames + ") values " + cValues + ")";

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Вы также можете привязать строки, которые вы хотите вставить, к параметру array-of-struct и использовать его в операторе вставки следующим образом:

INSERT INTO Singers(SingerId, FirstName, LastName)
SELECT * FROM UNNEST(@struct_array_param)

Где @struct_array_param - связанный параметр, содержащий массивSTRUCTS (кортежи).Помимо краткого и безопасного синтаксиса SQL, использование связанных параметров дает дополнительное преимущество, заключающееся в возможности использовать один и тот же кэшированный план запросов для нескольких выполнений одного и того же оператора вставки (с различными связанными значениями).

0 голосов
/ 22 декабря 2018

Если вы хотите вставить много строк, может быть проще использовать BatchTransaction.insert https://cloud.google.com/nodejs/docs/reference/spanner/2.1.x/BatchTransaction#insert

database.runTransaction(async (err, transaction) => {
    if (err) {
        console.error(err);
        return;
    }
    try {
        var itemsToInsert = [
            { SingerId: 12, FirstName: 'Mellissa', LastName: 'Garcia' },
            { SingerId: 13, FirstName: 'Russell', LastName: 'Morales' },
            { SingerId: 14, FirstName: 'Jacqueline', LastName: 'Long' },
            { SingerId: 15, FirstName: 'Dylan', LastName: 'Shaw' },
        ]

        transaction.insert('Singers', itemsToInsert);;
        await transaction.commit();
        console.log(`${itemsToInsert.length} records inserted.`);
    } catch (err) {
        console.error('ERROR:', err);
    } finally {
        database.close();
    }
});

Если вы хотите использовать DML, вы можете сделать оператор SQL программно.Следующее будет строить оператор вставки.Я не запускал вашу версию, но думаю, что в ней могут быть синтаксические ошибки, связанные с запятыми.

function buildSqlInsert(tableName, columnNames, rows) {
    var sqlString = "INSERT " + tableName + " (" + columnNames.join(', ') + ") VALUES \n";

    // add each row being careful to match the column order with columnNames
    rows.forEach(row => {
        sqlString += "(";
        columnNames.forEach(columnName => {
        var columnValue = row[columnName]
        // strings should be quoted
        if (typeof columnValue == 'string' || columnValue instanceof String) {
            columnValue = "'" + columnValue + "'";
        }
        sqlString += columnValue + ", ";
        });
        // trim added chars.
        sqlString = sqlString.substring(0, sqlString.length - 2);
        sqlString += "),\n"
    });
    // trim added comma/newline
    sqlString = sqlString.substring(0, sqlString.length - 2);

    return sqlString
}

insertStatement = buildSqlInsert('Singers', Object.keys(itemsToInsert[0]), itemsToInsert)

const rowCount = await transaction.runUpdate({
    sql: insertStatement,
});
...