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 valueSets = <String>[];
  final params = <String, dynamic>{};
  for (var i = 0; i < rows.length; i++) {
    final keys = columns.map((c) => 'r${i}_$c').toList();
    valueSets.add('(${keys.map(ph).join(', ')})');
    for (final col in columns) {
      params['r${i}_$col'] = rows[i][col];
    }
  }
  return rawQuery(
    'INSERT INTO $table ($colList) VALUES ${valueSets.join(', ')} RETURNING *;',
    values: params,
  );
}