stephencelis / SQLite.swift

A type-safe, Swift-language layer over SQLite3.
MIT License
9.72k stars 1.57k forks source link

Support for returning #1221

Open mfbx9da4 opened 1 year ago

mfbx9da4 commented 1 year ago

As far as I can tell there is no way to return anything other than the rowId inserted from an UPDATE or INSERT statement. That would be useful in my use case. eg

let alice = users.filter(id == 1)
let row = try db.run(alice.update(email <- "alice@me.com").returning(users[*]))
dmitrygusev commented 1 year ago

FYI here's how it can be solved for a simple case:

extension Insert {
    func returning(_ columns: [Expression<Int64>]) -> Insert {
        var template = self.template
        let bindings = self.bindings

        template.append(" RETURNING ")
        template.append(columns.map { column in column.expression.template }.joined(separator: ", "))

        let insert = Insert(template, bindings)

        return insert
    }
}

...
let insert = table1.insert(...).returning([col1, col2])

if let results = try? db().prepareRowIterator(insert.template, bindings: insert.bindings) {
   // handle results as usual
}