insertBatch method

  1. @override
Future<DbResult> insertBatch(
  1. String table,
  2. List<Map<String, dynamic>> rows
)
override

Inserts multiple rows into table in a single batch operation.

All rows must have the same set of keys. Returns a DbResult containing the inserted rows (PostgreSQL returns them via RETURNING *; other drivers return an empty rows list with DbResult.affectedRows set).

await db.insertBatch('products', [
  {'name': 'Widget', 'price': 9.99},
  {'name': 'Gadget', 'price': 19.99},
  {'name': 'Doohickey', 'price': 4.99},
]);

Implementation

@override
Future<DbResult> insertBatch(
  String table,
  List<Map<String, dynamic>> rows,
) async {
  if (rows.isEmpty) return const DbResult(rows: [], affectedRows: 0);
  final columns = rows.first.keys.toList();
  final colList = columns.join(', ');
  final placeholderRow =
      '(${List.filled(columns.length, '?').join(', ')})';
  final valueSets = List.filled(rows.length, placeholderRow);
  // Flatten values in row-major order to match positional ? placeholders.
  final params = <String, dynamic>{};
  for (var i = 0; i < rows.length; i++) {
    for (final col in columns) {
      params['r${i}_$col'] = rows[i][col];
    }
  }
  return rawQuery(
    'INSERT INTO $table ($colList) VALUES ${valueSets.join(', ')};',
    values: params,
  );
}