insertBatch method
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(', ')};',
values: params,
);
}