Skip to content

storage_t::update

Yevgeniy Zakharov edited this page May 15, 2017 · 4 revisions
template<class O>
void update(const O &o);

Update routine. Sets all non primary key fields where primary key is equal. For example if you have class/table with fields/columns [ ID, name, date, type ] then 'name', 'date' and 'type' will be updated in a row where 'ID' is equal. Note that it doesn't matter how your primary key column is named. If you try to update object of a mapped type that has no primary key on schema std::runtime_error will be thrown. To update a value without primary key please use update_all member function instead.

Parameters

class O is an object type. May be not specified explicitly cause it can be deduced by compiler from first parameter.

(1) o is and object to be updated.

Example

#include "sqlite_orm.h"

#include <iostream>
#include <memory>

using std::cout;
using std::endl;

struct Employee {
    int id;
    std::string name;
    int age;
    std::string address;
    double salary;
};

inline auto initStorage(const std::string &path) {
    using namespace sqlite_orm;
    return make_storage(path,
                        make_table("COMPANY",
                                   make_column("ID",
                                               &Employee::id,
                                               primary_key()),
                                   make_column("NAME",
                                               &Employee::name),
                                   make_column("AGE",
                                               &Employee::age),
                                   make_column("ADDRESS",
                                               &Employee::address),
                                   make_column("SALARY",
                                               &Employee::salary)));
}

typedef decltype(initStorage("")) Storage;

static std::shared_ptr<Storage> stor;

int main(int argc, char **argv) {
    stor = std::make_shared<Storage>(initStorage("update.sqlite"));
    stor->sync_schema();
    stor->remove_all<Employee>();
    
    //  insert initial values
    stor->replace(Employee{ 1, "Paul", 32, "California", 20000.0 });
    stor->replace(Employee{ 2, "Allen", 25, "Texas", 15000.0 });
    stor->replace(Employee{ 3, "Teddy", 23, "Norway", 20000.0 });
    stor->replace(Employee{ 4, "Mark", 25, "Rich-Mond", 65000.0 });
    stor->replace(Employee{ 5, "David", 27, "Texas", 85000.0 });
    stor->replace(Employee{ 6, "Kim", 22, "South-Hall", 45000.0 });
    stor->replace(Employee{ 7, "James", 24, "Houston", 10000.0 });
    
    //  show 'COMPANY' table contents
    for(auto &employee : stor->view<Employee>()) {
        cout << stor->dump(employee) << endl;
    }
    cout << endl;
    
    //  'UPDATE COMPANY SET ADDRESS = 'Texas' WHERE ID = 6'
    
    auto employee6 = stor->get<Employee>(6);
    employee6.address = "Texas";
    stor->update(employee6);    //  actually this call updates all non-primary-key columns' values to passed object's fields
    
    //  show 'COMPANY' table contents again
    for(auto &employee : stor->view<Employee>()) {
        cout << stor->dump(employee) << endl;
    }
    cout << endl;
    
    //  'UPDATE COMPANY SET ADDRESS = 'Texas', SALARY = 20000.00 WHERE AGE < 30'
    using namespace sqlite_orm;
    stor->update_all(set(&Employee::address, "Texas",
                         &Employee::salary, 20000.00),
                     where(lesser_than(&Employee::age, 30)));
    
    //  show 'COMPANY' table contents one more time
    for(auto &employee : stor->view<Employee>()) {
        cout << stor->dump(employee) << endl;
    }
    cout << endl;
    
    return 0;
}

See also

update_all

Clone this wiki locally