upsert method
Implementation
@override
Future<bool> upsert(
Map<String, dynamic> values,
List<String> uniqueBy, [
Map<String, dynamic>? update,
]) async {
try {
if (values.isEmpty) {
throw InvalidArgumentException(
"Values map cannot be empty for upsert operation.",
);
}
conn = await getConnection();
final columns = values.keys.toList();
final paramBindings = <String, dynamic>{};
final placeholders = values.keys
.map((key) {
final paramName = _nextParamName();
paramBindings[paramName] = values[key];
return ":$paramName";
})
.join(", ");
String sql =
"INSERT INTO $getTable (${columns.join(', ')}) VALUES ($placeholders)";
if (update == null) {
update = Map.from(values);
for (var col in uniqueBy) {
update.remove(col);
}
}
if (update.isNotEmpty) {
final updateClauses = update.entries
.map((entry) {
final paramName = _nextParamName();
paramBindings[paramName] = entry.value;
return "${entry.key} = :$paramName";
})
.join(", ");
sql += " ON DUPLICATE KEY UPDATE $updateClauses";
}
await conn.execute(sql, paramBindings);
return true;
} catch (e) {
rethrow;
}
}