ã¿ãªããããã«ã¡ã¯ã ç§ã¯åããŠHabrÃ©ã«æžã蟌ã¿ãŸããå³å¯ã«å€æããªãã§ãã ããã C ++ã§ãŠãããŒãµã«SQLite ORMã©ã€ãã©ãªãèŠã€ããçµéšãšãC ++ sqlite_ormã§SQLiteãæäœããããã®ç¬èªã®ã©ã€ãã©ãªã®æ°ããéçºãå
±æããããšæããŸãã
ORMãæ€çŽ¢ãããšããããã€ãã®éèŠãªãã€ã³ãããå§ããŸããã
- ã©ã€ãã©ãªã«ã¯CRUDãšéCRUDã®äž¡æ¹ãå¿
èŠã§ã
- æè»ãªWHEREæ¡ä»¶ã¯å¿
èŠã§ãããæããª
WHERE id = ?
- ã¢ããªã±ãŒã·ã§ã³ã®æŽæ°ã®å Žåãç§»è¡ïŒåæã¹ããŒã ïŒæ©èœãå¿
èŠã§ãã
- ORDER BYãLIMITãªã©ã®æ©èœãå¿
èŠã§ã
- ã¯ã©ã¹ã®ã·ãªã¢ã«åã¯ãã¯ã©ã¹ã«èšè¿°ããªãã§ãã ããã ããã¯ç§ã«ãšã£ãŠéåžžã«éèŠãªãã€ã³ãã§ããJavaãç¹ã«Androidéçºã«ç²Ÿéããããã§ãã Androidéçºè
ã¯ãåäžè²¬ä»»ã®ååïŒåäžè²¬ä»»ã®ååïŒãé å®ããããšããŸããããã¯ãæéãšãšãã«å€åããå¯èœæ§ã®ããã©ã€ãã©ãªãšã¢ãžã¥ãŒã«ã®ç°ãªãããŒãããã¢ããªã±ãŒã·ã§ã³ãçµã¿ç«ãŠãå Žåã«éåžžã«éèŠã§ãã ãããã£ãŠãC ++ hiberliteã® Github SQLiteã§æã人æ°ã®ããORM'kaã¯ãã·ãªã¢ã«åã¡ãœããã«é©ããŠããªã-ã¢ãã«ã¯ã©ã¹ã«ã¯ãçŽæ¥ã·ãªã¢ã«åã³ãŒãã䜿çšããéç
serialize
颿°ãå¿
èŠã§ãã ããŒã¿ã¢ãã«ã®ã³ãŒãã«äŸåããªãã¢ãžã¥ãŒã«ãæ¢ããŠããŸããã çµå±ã®ãšãããç§ã¯ããã€ãã®ã·ãªã¢ã©ã€ã¶ãŒïŒJSONãXMLãSQLiteïŒãæã€ããšãã§ãããã¹ãŠã®äººãããŒã¿ã¢ãã«ã«æ¥ç¶ããå¿
èŠããããŸãããããã倿Žããªãã§ãã ãããããããªããšãã¢ãã«ã³ãŒããæ··ä¹±ããŸãã
- æšæºã©ã€ãã©ãªã®ã¹ã¿ã€ã«ã®ã³ãŒã-æè¿ããã®åŸåã人æ°ãéããŠããŸãïŒäžè¬çã«ããã®ã©ã€ãã©ãªã¯ç§ã«æéãäžããŸããïŒ
- ãã¡ã€ã«ã·ã¹ãã äžã®ããŒã¿ããŒã¹ãšã¡ã¢ãªå
ã®äž¡æ¹ã®ãµããŒã
- SQLiteã¯ã©ã€ã¢ã³ããä»ããŠããŒã¿ããŒã¹ã«ã¢ã¯ã»ã¹ããå¿
èŠãããå Žåã«åããŠãã¯ã©ã¹åãšãã®ãã£ãŒã«ãã«é¢ä¿ãªããããŒãã«ãšåã«ååãä»ããæ©èœãéçºè
ã«ä»»ããŸãã
- ååŒ
hiberlite
å ããŠãããŸããŸãªã©ã€ãã©ãªãhiberlite
ãããŸãããäœããã®çç±ã§æ©èœãã»ãšãã©ãããŸããã èšãæãããšãéçºè
ã¯libsqlite3
ã䜿çšããŠããŒã¿ããŒã¹ã«çŽæ¥æ¥ç¶ããããã®ã³ãŒããèšè¿°ããå¿
èŠãããããšãlibsqlite3
ãŸããããªããã®ãããªORMãå¿
èŠãªã®ã§ããããïŒ
ç§ã¯å°å
¥éšã«åŒããã蟌ãŸããããã§ã sqlite_ormã©ã€ãã©ãªãæäŸããå¯èœæ§ã«çŽæ¥è¡ããŸã ã
1ïŒCRUD
äŸïŒ
struct User{ int id; std::string firstName; std::string lastName; int birthDate; std::shared_ptr<std::string> imageUrl; int typeId; };
struct UserType { int id; std::string name; };
2ã€ã®ã¯ã©ã¹ã次ã«2ã€ã®ããŒãã«ã
çžäºäœçšã¯ãããŒã¿ããŒã¹ãžã®ã€ã³ã¿ãŒãã§ã€ã¹ãæã€ãµãŒãã¹ãªããžã§ã¯ãã§ããstorage
ãªããžã§ã¯ããä»ããŠè¡ãããŸãã storage
ã¯make_storage
颿°ã«ãã£ãŠäœæãããŸãã äœææã«ãã¹ããŒã ã瀺ãããŸãã
using namespace sqlite_orm; auto storage = make_storage("db.sqlite", make_table("users", make_column("id", &User::id, autoincrement(), primary_key()), make_column("first_name", &User::firstName), make_column("last_name", &User::lastName), make_column("birth_date", &User::birthDate), make_column("image_url", &User::imageUrl), make_column("type_id", &User::typeId)), make_table("user_types", make_column("id", &UserType::id, autoincrement(), primary_key()), make_column("name", &UserType::name, default_value("name_placeholder"))));
ããŒã¿ã¢ãã«ã¯ãªããžããªã«ã€ããŠãææ°ã§ã¯ãªããããšã«æ³šæããŠãã ããã ãŸããã¯ã©ã¹ã®ååãšãã£ãŒã«ãåã¯ãäºãã«ç¬ç«ããŠããŸãã ããã«ãããããšãã°ãã©ã¯ãã®å Žåã®ã³ãŒããšãã¢ã³ããŒã¹ã³ã¢ã䜿çšããããŒã¿ããŒã¹ã¹ããŒããèšè¿°ã§ããŸãã
make_storage
æåã®ãã©ã¡ãŒã¿ãŒã¯ãã¡ã€ã«åã§ããã®åŸããŒãã«ãç§»åããŸãã ããŒãã«ãäœæããã«ã¯ãããŒãã«åãæå®ããŸãïŒã¯ã©ã¹ãšã¯é¢ä¿ãããŸãããèªååœåãè¡ãå Žåãå®è£
ã¯ããŸãè¯ããªãããã§ãïŒ typeid(T).name()
ã䜿çšããå¿
èŠããããŸããããã¯åžžã«æç¢ºãªååã§ã¯ãªãã·ã¹ãã åãè¿ããŸããããŸãã¯ãã¯ãã䜿ã£ãããªãã¯ïŒéåžžã¯æ¿èªããŠããŸããïŒã䜿çšããŠãåã瀺ããŸãã 1ã€ã®åãäœæããã«ã¯ãå°ãªããšã2ã€ã®ãã©ã¡ãŒã¿ãŒãå¿
èŠã§ããåã®ååãšã¯ã©ã¹ãã£ãŒã«ããžã®ãªã³ã¯ã§ãã ãã®ãªã³ã¯ã¯ãåã®ã¿ã€ããšå°æ¥ã®å²ãåœãŠã®ã¢ãã¬ã¹ã決å®ããŸãã åŸã§AUTOINCREMENT
ããã³/ãŸãã¯PRIMARY KEY
ãDEFAULT
远å ããããšãã§ããŸãã
ããã§ã storage
ãªããžã§ã¯ãã®é¢æ°ã®åŒã³åºããä»ããŠããŒã¿ããŒã¹ã«ã¯ãšãªãéä¿¡ã§ããŸãã ããšãã°ããŠãŒã¶ãŒãäœæããŠINSERT
ãå®è¡ããŸãããã
User user{-1, "Jonh", "Doe", 664416000, std::make_shared<std::string>("url_to_heaven"), 3 }; auto insertedId = storage.insert(user); cout << "insertedId = " << insertedId << endl; user.id = insertedId;
INSERT INTO users(first_name, last_name, birth_date, image_url, type_id) VALUES('Jonh', 'Doe', 664416000, 'url_to_heaven', 3)
ã
ãŠãŒã¶ãŒãªããžã§ã¯ãã®äœææã«æå®ããæåã®åŒæ°-1ã¯idã§ãã idã¯PRIMARY KEYåã§ãããããäœææã«ã¯ç¡èŠãããŸãã sqlite_orm
ã¯ãINSERT sqlite_orm
PRIMARY KEYåãç¡èŠããæ°ããäœæããããªããžã§ã¯ãã®IDãè¿ããŸãã ãããã£ãŠãINSERTã®åŸã user.id = insertedId;
ãå®è¡ãuser.id = insertedId;
-ãã®åŸããŠãŒã¶ãŒã¯æ¬æ Œçã«ãªããã³ãŒãã§ããã«äœ¿çšã§ããŸãã
åããŠãŒã¶ãŒãååŸããã«ã¯ã get
颿°ã䜿çšããŸãã
try{ auto user = storage.get<User>(insertedId); cout << "user = " << user.firstName << " " << user.lastName << endl; }catch(sqlite_orm::not_found_exception) { cout << "user not found with id " << insertedId << endl; }catch(...){ cout << "unknown exeption" << endl; }
get
ã¯ã User
ã¯ã©ã¹ã®ãªããžã§ã¯ãïŒãã³ãã¬ãŒããã©ã¡ãŒã¿ãŒãšããŠæž¡ãããã®ïŒãè¿ããŸãã ãã®IDãæã€ãŠãŒã¶ãŒãããªãå ŽåãäŸå€sqlite_orm::not_found_exception
ãŸãã äŸå€ã®ãããã®ãããªã€ã³ã¿ãŒãã§ã€ã¹ã¯äžäŸ¿ãããããŸããã ããã¯ãC ++ã§ã¯ãJavaãCïŒããŸãã¯Objective-Cã§å®è¡ã§ããããããªããžã§ã¯ãã ããç¡å¹ã«ã§ããªãããã§ãã null蚱容åãšããŠstd::shared_ptr<T>
ã䜿çšã§ããŸãã ãã®å Žåã get
颿°ã®2çªç®ã®ããŒãžã§ã³get_no_throw
ãŸãã
if(auto user = storage.get_no_throw<User>(insertedId)){ cout << "user = " << user->firstName << " " << user->lastName << endl; }else{ cout << "no user with id " << insertedId << endl; }
ããã§ããŠãŒã¶ãŒã¯std::shared_ptr<User>
ããã nullptr
ãšåãã«ããããšãããŠãŒã¶ãŒèªäœãä¿åããããšãã§ããŸãã
次ã«ããŠãŒã¶ãŒãUPDATE
ããå ŽåããããŸãã ãããè¡ãã«ã¯ã倿Žãããã£ãŒã«ãã倿Žãã update
颿°ãåŒã³åºããŸãã
user.firstName = "Nicholas"; user.imageUrl = "https://cdn1.iconfinder.com/data/icons/man-icon-set/100/man_icon-21-512.png" storage.update(user);
ããã¯æ¬¡ã®ããã«æ©èœãUPDATE users SET ... primary key... WHERE id = % , , primary key%
ãåŒã³åºããUPDATE users SET ... primary key... WHERE id = % , , primary key%
ã
ãã¹ãŠãã·ã³ãã«ã§ãã ãªããžããªãšå¯Ÿè©±ããããã®ãããã·ãªããžã§ã¯ãã¯ãªãããšã«æ³šæããŠãã ããããªããžããªã¯ãã¯ãªãŒã³ãªãã¢ãã«ãªããžã§ã¯ããåãå
¥ããŠè¿ããŸãã ããã«ããããžã§ããç°¡çŽ åããããšã³ããªã®ãããå€ãäžãããŸãã
IDã«ãããªããžã§ã¯ãã®åé€ã¯ã次ã®ããã«å®è£
ãããŸãã
storage.remove<User>(insertedId);
ããã§ã¯ãã³ã³ãã€ã©ã§åãæšæž¬ããå Žæããªãããããã³ãã¬ãŒããã©ã¡ãŒã¿ãšããŠåãæç€ºçã«æå®ããå¿
èŠããããŸãã
ãããCRUDã®çµäºç¹ã§ãã ãã ããããã¯æ©èœã«éå®ãããŸããã sqlite_orm
ã®CRUD颿°ã¯ã PRIMARY KEY
ãæã€1ã€ã®åãæã€ãªããžã§ã¯ãã§ã®ã¿æ©èœãã颿°ã§ãã CRUD以å€ã®æ©èœããããŸãã
ããšãã°ã SELECT * FROM users
å®è¡ããŠã¿ãŸãããã
auto allUsers = storage.get_all<User>(); cout << "allUsers (" << allUsers.size() << "):" << endl; for(auto &user : allUsers) { cout << storage.dump(user) << endl; }
倿°allUsers
ã®ã¿ã€ãã¯std::vector<User>
ã§ãã dump
颿°ã«æ³šæããŠãã ããããªããžããªã«é¢é£ä»ããããã¯ã©ã¹ãªããžã§ã¯ããååŸãã std::string
圢åŒã§jsonã¹ã¿ã€ã«ã§æ
å ±ãè¿ãstd::string
ã ããšãã°ãã{idïŒ '1'ãfirst_nameïŒ 'Jonh'ãlast_nameïŒ 'Doe'ãbirth_dateïŒ '664416000'ãimage_urlïŒ '0x10090c3d8'ãtype_idïŒ '3'}ãã
ããããããã§ã¯ååã§ã¯ãããŸããã ORMã©ã€ãã©ãªã¯ãWHEREå¥ããªããšå®å
šãšèŠãªãããšã¯ã§ããŸããã ãããã£ãŠã sqlite_orm
ã«ãååšããŸãããéåžžã«åŒ·åã§ãã
äžèšã®get_all
颿°ã¯ãæ¡ä»¶ä»ãã®where
颿°ã®çµæãåŒæ°ãšããŠåãããšãã§ããŸãã ããšãã°ãIDã10æªæºã®ãŠãŒã¶ãŒãéžæããŠã¿ãŸããããã¯ãšãªã¯æ¬¡ã®ããã«ãªããŸãSELECT * FROM users WHERE id < 10
ã ã³ãŒãã§ã¯ã次ã®ããã«ãªããŸãã
auto idLesserThan10 = storage.get_all<User>(where(lesser_than(&User::id, 10)));
ãŸãã¯ãfirstNameãã£ãŒã«ãããJohnãã«çãããªããŠãŒã¶ãŒãéžæããŸãã ã¯ãšãªã¯SELECT * FROM users WHERE first_name != 'John'
auto notJohn = storage.get_all<User>(where(is_not_equal(&User::firstName, "John")));
ããã«ãæŒç®å&&
ã ||
ãããŠ!
ïŒããæç¢ºã«ããããã«ããããã®æŒç®åã®ãªãã©ã«ããŒãžã§ã³ã䜿çšããããšããå§ãããŸãã
auto notJohn2 = storage.get_all<User>(where(not is_equal(&User::firstName, "John")));
notJohn2
åçnotJohn
ã
ãããŠããªã³ã¯ãããæ¡ä»¶ãæã€å¥ã®äŸïŒ
auto id5and7 = storage.get_all<User>(where(lesser_or_equal(&User::id, 7) and greater_or_equal(&User::id, 5) and not is_equal(&User::id, 6)));
ãã®ã¯ãšãªSELECT * FROM users WHERE where id >= 5 and id <= 7 and not id = 6
ãå®è£
ããŸããã
ãŸãã¯SELECT * FROM users WHERE id = 10 or id = 16
ïŒ
auto id10or16 = storage.get_all<User>(where(is_equal(&User::id, 10) or is_equal(&User::id, 16)));
ãããã£ãŠãæ¡ä»¶ã®ä»»æã®çµã¿åããããæ¥çãã§ããŸãã ããã«ãSQLiteã®ãçã®ã¯ãšãªãã®ããã«æ¬åŒ§ã䜿çšããŠæ¡ä»¶ã®åªå
床ãæå®ã§ããŸãã ããšãã°ã次ã®2ã€ã®ã¯ãšãªã¯ãè¿ãããçµæãç°ãªããŸãã
auto cuteConditions = storage.get_all<User>(where((is_equal(&User::firstName, "John") or is_equal(&User::firstName, "Alex")) and is_equal(&User::id, 4))); cuteConditions = storage.get_all<User>(where(is_equal(&User::firstName, "John") or (is_equal(&User::firstName, "Alex") and is_equal(&User::id, 4))));
æåã®æ¡ä»¶ã§ã¯WHERE (first_name = 'John' or first_name = 'Alex') and id = 4
ã§ã2çªç®ã®æ¡ä»¶ã§ã¯WHERE first_name = 'John' or (first_name = 'Alex' and id = 4)
ã§ãã
ãã®éæ³ã¯ãC ++ã®æ¬åŒ§ã«ã¯æäœã®åªå
é äœãæç€ºçã«æ±ºå®ããã®ãšåãæ©èœãããããã«æ©èœããŸãã ããã«ã sqlite_orm
èªäœã¯C ++ã§SQLiteãæäœããããã®äŸ¿å©ãªããã³ããšã³ãã§ãããããïŒã©ã€ãã©ãªïŒèªäœã¯ã¯ãšãªãå®è¡ãããããã¹ãã«å€æããŠsqlite3ãšã³ãžã³ãéä¿¡ããŸãã
IN
ã¹ããŒãã¡ã³ãããããŸãã
auto evenLesserTen10 = storage.get_all<User>(where(in(&User::id, {2, 4, 6, 8, 10})));
SELECT * FROM users WHERE id IN (2, 4, 6, 8, 10)
ã倿ããŸããã ãŸãã¯ããã«è¡ããããŸãïŒ
auto doesAndWhites = storage.get_all<User>(where(in(&User::lastName, {"Doe", "White"})));
ããã§ã¯ã SELECT * FROM users WHERE last_name IN ("Doe", "White")
ãªã¯ãšã¹ããããŒã¿ããŒã¹ã«éä¿¡ããŸããã
in
颿°ã¯ãã¯ã©ã¹ãã£ãŒã«ããžã®ãã€ã³ã¿ãŒãšãã¯ãã«/åæåãªã¹ãã®2ã€ã®åŒæ°ãåããŸãã ãã¯ãã«/åæåãªã¹ãã®ã³ã³ãã³ãã¿ã€ãã¯ãæåã®ãã©ã¡ãŒã¿ãŒãšããŠæž¡ãããã£ãŒã«ããã€ã³ã¿ãŒãšåãã§ãã
æ¡ä»¶é¢æ°is_equal
ã is_not_equal
ã greater_than
ã greater_or_equal
ã lesser_than
ã lesser_or_equal
ã¯ãããã2ã€ã®åŒæ°ãåããŸãã åŒæ°ã¯ãã¯ã©ã¹ãã£ãŒã«ããžã®ãã€ã³ã¿ããŸãã¯å®æ°/倿°ã®ããããã§ãã ãã£ãŒã«ããžã®ãã€ã³ã¿ã¯ãååãããã³ãªãã©ã«ã®ãŸãŸã¯ãšãªã«è§£æãããæååã®ã¿ããšããžã®åšãã«åŒçšç¬Šãæ®ã£ãŠããŸãã
質åããããããããŸããïŒã©ã®åã«ã瀺ãããŠããªãã¯ã©ã¹ãã£ãŒã«ããžã®ãã€ã³ã¿ãŒãæ¡ä»¶ã«æž¡ããšã©ããªããŸããïŒ ãã®å ŽåãäŸå€std::runtime_error
ã説æããã¹ããšãšãã«ã¹ããŒãããŸãã ãªããžããªã«ãã€ã³ããããŠããªãã¿ã€ããæå®ããå Žåãåãããšãèµ·ãããŸãã
ãšããã§ã WHERE
å¥ã¯DELETE
ã¯ãšãªã§äœ¿çšã§ããŸãã ããã«ã¯remove_all
颿°ãããremove_all
ã ããšãã°ãIDã100æªæºã®ãã¹ãŠã®ãŠãŒã¶ãŒãåé€ããŸãããã
storage.remove_all<User>(where(lesser_than(&User::id, 100)));
äžèšã®äŸã¯ãã¹ãŠãæ¬æ Œçãªãªããžã§ã¯ãã§åäœããŸãã ãããSELECT
1ã€ã®åã§SELECT
ãåŒã³åºãããå Žåã¯ã©ãã§ããããïŒ ããããããŸãïŒ
auto allIds = storage.select(&User::id);
ãããSELECT id FROM users
ãšåŒã³ãŸããã allIds
ã®ã¿ã€ãã¯std::vector<decltype(User::id)>
ãŸãã¯std::vector<int>
ã§ãã
æ¡ä»¶ã远å ã§ããŸãïŒ
auto doeIds = storage.select(&User::id, where(is_equal(&User::lastName, "Doe")));
ãSELECT id FROM users WHERE last_name = 'Doe'
ãšãããããã¯SELECT id FROM users WHERE last_name = 'Doe'
ã§ãã
å€ãã®ãªãã·ã§ã³ããããŸãã ããšãã°ãidã300æªæºã®ãã¹ãŠã®å§ãèŠæ±ã§ããŸãã
auto allLastNames = storage.select(&User::lastName, where(lesser_than(&User::id, 300)));
ORDER BY
ORMãORMãæ³šæãªãã ORDER BY
å€ãã®ãããžã§ã¯ãã§äœ¿çšãããŠããã sqlite_orm
ã«ã¯ã€ã³ã¿ãŒãã§ãŒã¹ããããŸãã
æãç°¡åãªäŸ-idã§äžŠã¹ããããŠãŒã¶ãŒãéžæããŸãããïŒ
auto orderedUsers = storage.get_all<User>(order_by(&User::id));
ããã¯SELECT * FROM users ORDER BY id
å€ããSELECT * FROM users ORDER BY id
ã ãŸãã¯ã where
ãšorder_by
çµã¿åãããŠã¿ãŸãããïŒ SELECT * FROM users WHERE id < 250 ORDER BY first_name
auto orderedUsers2 = storage.get_all<User>(where(lesser_than(&User::id, 250)), order_by(&User::firstName));
æç€ºçãªASC
ããã³DESC
æå®ããããšãã§ããŸãã äŸïŒ SELECT * FROM users WHERE id > 100 ORDER BY first_name ASC
ïŒ
auto orderedUsers3 = storage.get_all<User>(where(greater_than(&User::id, 100)), order_by(asc(&User::firstName)));
ãŸãã¯ããïŒ
auto orderedUsers4 = storage.get_all<User>(order_by(desc(&User::id)));
SELECT * FROM users ORDER BY id DESC
ã§ããã
ãããŠãã¡ããã select
ã¯order_by
ã§ãåäœãselect
ïŒ
auto orderedFirstNames = storage.select(&User::firstName, order_by(desc(&User::id)));
SELECT first_name FROM users ORDER BY ID DESC
ã§ããã
ç§»è¡
ã©ã€ãã©ãªã«ã¯ç§»è¡èªäœã¯ããsync_schema
ãã sync_schema
颿°ããããŸãã ãã®é¢æ°ã®åŒã³åºãã¯ãããŒã¿ããŒã¹ã«çŸåšã®ã¹ããŒã ãèŠæ±ããã¹ãã¬ãŒãžã®äœææã«æå®ãããã¹ããŒã ãšæ¯èŒããäžèŽããªããã®ãããã°ãããä¿®æ£ããŸãã åæã«ãæ¢åã®ããŒã¿ã®å®å
šæ§ã¯ãã®åŒã³åºããä¿èšŒããŸããã ã¹ããŒã ãåäžã«ãªãããšã®ã¿ãä¿èšŒããŸãïŒãŸãã¯std::runtime_error
ãã¹ããŒãããŸããã¹ããŒã ãåæããã«ãŒã«ã®è©³çްã«ã€ããŠã¯ã githubã®ãªããžããªããŒãžãåç
§ããŠãã ããã
ååŒ
ã©ã€ãã©ãªã«ã¯ããã©ã³ã¶ã¯ã·ã§ã³ãå®è£
ããããã®2ã€ã®ãªãã·ã§ã³ãæç€ºçããã³æé»çããããŸãã æç€ºçãšã¯ã begin_transaction
ããã³commit
ãŸãã¯rollback
颿°ã®çŽæ¥åŒã³åºããæå³ããŸãã äŸïŒ
auto secondUser = storage.get<User>(2); storage.begin_transaction(); secondUser.typeId = 3; storage.update(secondUser); storage.rollback(); // storage.commit(); secondUser = storage.get<decltype(secondUser)>(secondUser.id); assert(secondUser.typeId != 3);
2çªç®ã®æ¹æ³ã¯å°ãè€éã§ãã æåã®ã³ãŒãïŒ
storage.transaction([&] () mutable { auto secondUser = storage.get<User>(2); secondUser.typeId = 1; storage.update(secondUser); auto gottaRollback = bool(rand() % 2); if(gottaRollback){ // return false; // ROLLBACK } return true; // COMMIT });
transaction
颿°ã¯ããã«BEGIN TRANSACTION
åŒã³åºããã©ã ãåŒãåŒæ°ãšããŠåãåãã bool
ãè¿ããŸãã true
è¿ãããå Žåã COMMIT
ãå®è¡ããROLLBACK
false
å ŽåïŒ ROLLBACK
ãã®ã¡ãœããã¯ããã©ã³ã¶ã¯ã·ã§ã³çµäºé¢æ°ïŒæšæºã©ã€ãã©ãªã®mutexã®std::lock_guard
ãªã©ïŒãåŒã³åºãããšãå¿ããªãããã«ããŸãã
éèšé¢æ°AVG
ã MAX
ã MIN
ã COUNT
ã GROUP_CONCAT
ãŸãã
auto averageId = storage.avg(&User::id); // 'SELECT AVG(id) FROM users' auto averageBirthDate = storage.avg(&User::birthDate); // 'SELECT AVG(birth_date) FROM users' auto usersCount = storage.count<User>(); // 'SELECT COUNT(*) FROM users' auto countId = storage.count(&User::id); // 'SELECT COUNT(id) FROM users' auto countImageUrl = storage.count(&User::imageUrl); // 'SELECT COUNT(image_url) FROM users' auto concatedUserId = storage.group_concat(&User::id); // 'SELECT GROUP_CONCAT(id) FROM users' auto concatedUserIdWithDashes = storage.group_concat(&User::id, "---"); // 'SELECT GROUP_CONCAT(id, "---") FROM users' auto maxId = storage.max(&User::id); // 'SELECT MAX(id) FROM users' auto maxFirstName = storage.max(&User::firstName); // 'SELECT MAX(first_name) FROM users' auto minId = storage.min(&User::id); // 'SELECT MIN(id) FROM users' auto minLastName = storage.min(&User::lastName); // 'SELECT MIN(last_name) FROM users'
詳现ã¯ãã¡ããã芧ãã ãã ã æ¹å€ãšåæ§ãè²¢ç®ãæè¿ããŸãã
ç·šé1
æåŸã®ã³ãããã§ã¯ãã¿ãã«ïŒã¿ãã«ïŒããè€æ°ã®åãéžæããŠãã¯ã¿ãŒã«ãçãããæ©èœã远å ãããŠããŸãã äŸïŒ
// `SELECT first_name, last_name FROM users WHERE id > 250 ORDER BY id` auto partialSelect = storage.select(columns(&User::firstName, &User::lastName), where(greater_than(&User::id, 250)), order_by(&User::id)); cout << "partialSelect count = " << partialSelect.size() << endl; for(auto &t : partialSelect) { auto &firstName = std::get<0>(t); auto &lastName = std::get<1>(t); cout << firstName << " " << lastName << endl; }
ç·šé2
æåŸã®ã³ãããã«ããã LIMIT
ããã³OFFSET
ãµããŒãã远å ãããŸãã LIMIT
ããã³OFFSET
ã䜿çšããããã®3ã€ã®ãªãã·ã§ã³ããããŸãã
- LIMITïŒ
limitïŒ
- LIMITïŒ
limitïŒ
OFFSETïŒ
offsetïŒ
- LIMITïŒ
offsetïŒ
ãïŒ
limitïŒ
äŸïŒ
// `SELECT first_name, last_name FROM users WHERE id > 250 ORDER BY id LIMIT 5` auto limited5 = storage.get_all<User>(where(greater_than(&User::id, 250)), order_by(&User::id), limit(5)); cout << "limited5 count = " << limited5.size() << endl; for(auto &user : limited5) { cout << storage.dump(user) << endl; } // `SELECT first_name, last_name FROM users WHERE id > 250 ORDER BY id LIMIT 5, 10` auto limited5comma10 = storage.get_all<User>(where(greater_than(&User::id, 250)), order_by(&User::id), limit(5, 10)); cout << "limited5comma10 count = " << limited5comma10.size() << endl; for(auto &user : limited5comma10) { cout << storage.dump(user) << endl; } // `SELECT first_name, last_name FROM users WHERE id > 250 ORDER BY id LIMIT 5 OFFSET 10` auto limit5offset10 = storage.get_all<User>(where(greater_than(&User::id, 250)), order_by(&User::id), limit(5, offset(10))); cout << "limit5offset10 count = " << limit5offset10.size() << endl; for(auto &user : limit5offset10) { cout << storage.dump(user) << endl; }
LIMIT 5, 10
ããã³LIMIT 5 OFFSET 10
æå³ãç°ãªãããšãå¿ããªãã§ãã ããã æ£ç¢ºã«ã¯ã LIMIT 5, 10
LIMIT 10 OFFSET 5
ã¯LIMIT 10 OFFSET 5
ã§ãã