ïŒå ã ã¯ïŒ1659ã«æçš¿ãããŠããŸããããããã«è°è«ããããã«ããã«ç§»åããŸãããïŒ
ç§ã¯ããã«ã€ããŠå°ãæéã®äžã«ããŸã-knexããã¥ã¡ã³ãã¯ãã©ã³ã¶ã¯ã·ã§ã³ã®æäœéãã«ããŒããŠããŸãããããŠããããã¹ãã«knex.jsã䜿çšããããšãava.js + knexããšãava.js +ããŒã¿ããŒã¹ããã°ãŒã°ã«ã§æ€çŽ¢ãããšãç§ã¯è¯ãæ¹æ³ã瀺ãããã«ç¹ã«æçãªãã®ãèŠã€ããããšãã§ããªãã£ãã®ã§ããã©ã³ã¶ã¯ã·ã§ã³ã§åäœãã¹ããã©ããããããšãåãã¹ãåŸã«DBããªã»ããããããã®äžè¬çãªææ³ã§ããRubyã®çµéšã«é ŒããŸããã
@odigityãã¹ãã§ã¯ãæ¥ç¶ããŒã«ã§ã¯ãªã1ã€ã®æ¥ç¶ã®ã¿ã䜿çšãããã¢ããªã®å®éã®äœ¿çšç¶æ³ãè¡šãããªãããããããè¡ãããšã¯ãå§ãããŸããã
ããã¯ç§ã«ã¯èµ·ãããŸãããããã¹ãåŸã®DBã¯ãªãŒã³ã¢ãããå®è£ ããããã«ãåçŽãª1åéãã®æ¹æ³ã䜿çšã§ããã®ã§ããã°ãããåãå ¥ããããšæããŸããã ïŒå¿µã®ãããããŒã«ã®æå°/æ倧ã1ã«èšå®ããŸãããïŒåææ¥ç¶ããµããŒãããªãããããå®çŸããæ¹æ³ãããã°ã絶察ã«åãå ¥ããŸãã
ãŸãããã¹ãããŠããã¢ããªã±ãŒã·ã§ã³ããã¹ãã³ãŒãå ã§éå§ãããã®ãšåããã©ã³ã¶ã¯ã·ã§ã³ã§ã¯ãšãªãå®è¡ããŠããªãéããå®è£ ããããšã¯ã»ãšãã©äžå¯èœã§ãïŒãã¹ãã§ãã©ã³ã¶ã¯ã·ã§ã³ãéå§ããŠããã¢ããªãèµ·åããäœæãããã©ã³ã¶ã¯ã·ã§ã³ãã¢ããªã«æž¡ããŠãåããã©ã³ã¶ã¯ã·ã§ã³ã«å¯ŸããŠãã¹ãŠã®ã¯ãšãªãå®è¡ãããã¹ãããããã©ã³ã¶ã¯ã·ã§ã³ã¯ã²ã©ãåäœããå¯èœæ§ããããŸã...ïŒã
ç§ããããæ©èœããããšãæåŸ /æåŸ ããæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
1ïŒååäœãã¹ãã§ã trx
ãçæãããã©ã³ã¶ã¯ã·ã§ã³ãäœæããŸãã
2ïŒæ¬¡ã«ããã¹ãããã¢ãžã¥ãŒã«ãèŠæ±ãã trx
ãªããžã§ã¯ããã¢ãžã¥ãŒã«ã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ããŠãã¢ãžã¥ãŒã«ã§äœ¿çšãããããã«ããŸããããã«ããããã¹ãŠã®ã¯ãšãªããã©ã³ã¶ã¯ã·ã§ã³å
ã§çºçããŸãã
3ïŒã¢ãžã¥ãŒã«ã¡ãœãããæ»ã£ãïŒãŸãã¯ãšã©ãŒãã¹ããŒããïŒåŸãDBã®çµæã®ç¶æ
ã«å¯ŸããŠã¢ãµãŒã·ã§ã³ãå®è¡ãã trx.rollback()
ãåŒã³åºããŠæåãããã¹ãŠãå
ã«æ»ãã次ã®ãã¹ãã®æºåãããŸãã
ã ãããããã¯ç§ãéæããããšããŠããããšã§ãããç§ãæåã«ãããéæããããšãæå³ããæ¹æ³ã§ãã ç§ã¯ãã£ââãšç¥ããããšæã£ãŠããŸãïŒ
1ïŒKnex.jsãã©ã®ããã«æ©èœãã䜿çšããå¿ èŠãããã®ãââ誀解ããŠããã®ã¯ãªãã§ããã
2ïŒããŒã¿ããŒã¹ã«ã¢ã¯ã»ã¹ããã³ãŒãã®ã¢ãããã¯åäœãã¹ããäœæããããã®ãã¹ããã©ã¯ãã£ã¹ã
æšå€ããknex.jsã䜿çšããŠã¢ãããã¯åäœãã¹ããäœæããæ¹æ³ããåè©Šè¡ãããšãããèå³æ·±ãçµæãåŸããããããã°ãŒã°ã«ã§ããŸããããªãã£ãããã§ãã ä»ããããèªã¿éãã€ããã§ãã äœãåŠãã ããŸãæçš¿ããŸãã
ããããäœããããŸããã ãœãŒã¹ã®æç³»åé ã§ã®èŠçŽïŒ
2016-04-21 https://medium.com/@jomaora/knex -bookshelf-mocks-and-unit-tests-cca627565d3
æŠç¥ïŒã¢ãã¯ãã€ãã䜿çšããŸãã DBãã¢ãã¯ããããªã-å®éã®MySQLDBã«å¯ŸããŠã¡ãœããããã¹ãããŠæ£ããåäœã確èªããã-ãšã«ããmock-knex
調ã¹ã...ããã¯ææªã®èšèšã®ã©ã€ãã©ãªãããããªãç§ã¯ä»ãŸã§ã«ééããããšããããŸãã :(
2016-04-28 http://mherman.org/blog/2016/04/28/test-driven-development-with-node/
æŠç¥ïŒåãã¹ãåŸã«DBãããŒã«ããã¯/å移è¡/åã·ãŒãããŸãã ããã¯ãåãã¹ãã®ãªãŒããŒãããã倧ããããã«æãããå®è¡é床ãéåžžã«é ããªããŸãã åæå®è¡æ§ã¯ãåãã¹ãã®DBåã«å¯ŸããŠUUIDãçæããããšã§å®çŸã§ããŸãããããã¯ãã©ã³ã¶ã¯ã·ã§ã³ã®åªé ãã«æ¯ã¹ãã°ã²ã©ã解決çã®ããã«æããŸã...
2015-09-23 http://stackoverflow.com/a/32749601/210867
æŠç¥ïŒãã¹ãã«ã¯sqliteã䜿çšãããã¹ãããšã«DBãäœæ/ç Žæ£ããŸãã äžèšã®ãã®ã¢ãããŒããå«ããªçç±ã®äž¡æ¹ã«ã€ããŠèª¬æããŸããã
ããã§...ãŸã ææ¡ãæ¢ããŠãããKnexãã©ã³ã¶ã¯ã·ã§ã³ãå®éã«ã©ã®ããã«æ©èœããããããã³ããããç§ã®ãŠãŒã¹ã±ãŒã¹ã«é©åã«é©çšããæ¹æ³ã«é¢ããè¿œå ã®ã¬ã€ãã³ã¹ãæ¢ããŠããŸãã
@odigityã¯ãæªããã¹ãææ³ãããŸããŸãšããŠããŸãð
ç§ãã¡ã¯æ¬¡ã®ãããªããŠãããããã¹ããè¡ã£ãŠããŸãã
ã·ã¹ãã ãèµ·åããDBãåæåãã移è¡ãå®è¡ããŸã
åãã¹ãã®åã«ããã¹ãŠã®ããŒãã«ãšã·ãŒã±ã³ã¹ãåãæšãŠãŸãïŒknex-db-managerããã±ãŒãžã䜿çšïŒ
ãã¹ãã±ãŒã¹ã«å¿ èŠãªããŒã¿ãæ¿å ¥ããŸãïŒãã¹ãããããªããžã§ã¯ãéå±€ã1ã€ã®ã³ãã³ãã§æ¿å ¥ã§ããããã«ããããã«knexããŒã¹ã®objection.js ORMã䜿çšããŸããæ¿å ¥ãæé©åããæ¹æ³ãç¥ã£ãŠãããããè¡ããšã«åå¥ã®æ¿å ¥ãè¡ãå¿ èŠã¯ãããŸãããããŒãã«å ã§ãããéåžžã¯ããŒãã«ããšã«1ã€ã®æ¿å ¥ã®ã¿ã§ãïŒ
1ã€ã®ãã¹ããå®è¡ããã¹ããã2ã«é²ã¿ãŸã
e2eãã¹ãã§ã¯ãsaveState / restoreStateïŒpg_restore / pg_dumpã䜿çšïŒã¡ãœãããå®è£ ããŸãããããã«ããããã¹ãå®è¡äžã«ç¹å®ã®ç¶æ ã«ããŒã«ããã¯ã§ãããããå®è¡åŸã«ãã¹ãã倱æãããã³ã«ãã¹ãå®è¡ãåéããå¿ èŠã¯ãããŸããããã¹ãã®åã
ããã¯ã·ã³ãã«ã§ççŽã§ãé²æ©ããå¿ èŠããã£ãã®ã§ãæšæ¥å§ããã®ãšäŒŒãŠããŸãã
ãã¹ãŠã®ããŒãã«ãåãæšãŠããããé«éãªä»£æ¿æ段ãšããŠããã¹ãããã©ã³ã¶ã¯ã·ã§ã³ã§ã©ããããåŸã§ããŒã«ããã¯ããæŠç¥ãæ€èšããŸãããïŒ å®è£ ãç解ã§ããã°ãããã¯ç§ã«ãšã£ãŠçæ³ã®ããã«æããŸãã
dbãšã¢ããªã±ãŒã·ã§ã³ã³ãŒããåãããã»ã¹ã§å®è¡ãããšããã¹ãã³ãŒãã§ãã©ã³ã¶ã¯ã·ã§ã³ãäœæãããã®ãã©ã³ã¶ã¯ã·ã§ã³ãknexã€ã³ã¹ã¿ã³ã¹ãšããŠç»é²ã§ãããšæããŸãïŒknexã€ã³ã¹ã¿ã³ã¹ãšãã©ã³ã¶ã¯ã·ã§ã³ã¯å°ãç°ãªãå ŽåããããŸãããéåžžã¯ãã©ã³ã¶ã¯ã·ã§ã³ã䜿çšã§ããŸãéåžžã®knexã€ã³ã¹ã¿ã³ã¹ã®ãããªã€ã³ã¹ã¿ã³ã¹ïŒã
次ã«ãéåžžã®ããŒã«ãããknexã€ã³ã¹ã¿ã³ã¹ã®ä»£ããã«ãã©ã³ã¶ã¯ã·ã§ã³ããã§ããããã¢ããªã±ãŒã·ã§ã³ã³ãŒããéå§ãããããä»ããŠã¯ãšãªãéå§ããŸãã
OPã§èª¬æããã®ãšã»ãŒåãæ¹æ³ã§ãã ããªãããããã©ã®ããã«èª¬æãããã¯å®è¡å¯èœã«èãããŸãã
æ°å¹Žåã®ãã¹ãã§DBããªã»ããããããã«ãã©ã³ã¶ã¯ã·ã§ã³ã䜿çšããããšãæ€èšããŸããããæ¥ç¶ããŒã«ãã¢ããªã§åäœããã®ãšã»ãŒåãæ¹æ³ã§åäœãããããããæåŠããŸãã+åãæšãŠ/åæåã¯ååã«é«éã§ãã
1ã€ã®ãããã§å®è¡ããããã¹ãŠã®ã¯ãšãªãåãæ¥ç¶ã䜿çšããåäžã®ãã©ã³ã¶ã¯ã·ã§ã³ã§ã©ããã§ããããã«ããã©ã³ã¶ã¯ã·ã§ã³ã®æéäžã«æ¥ç¶ã¢ãã£ããã£ãå®çŸããæ¹æ³ã¯ãããŸãããïŒ
åãæšãŠæŠç¥ã¯äžçš®ã®æ©èœã§ãããããã¯éåžžã«ãã«ãŒããã©ãŒã¹ã§ãã çŸåšãåãã¹ããã¡ã€ã«ã«test.after.alwaysïŒïŒããã¯ãããããã®ãã¡ã€ã«å ã®ãã¹ãã®åœ±é¿ãåããããŒãã«ïŒéåžžã¯ãã¡ã€ã«ããšã«1ã€ã®ããŒãã«ïŒãåãæšãŠãŠããŸãããããã«ãã£ãŠå°ç¡ãã«ãªããšããžã±ãŒã¹ãèããããšãã§ããŸãã
ããšãã°ãåãããŒãã«ã«ã¢ã¯ã»ã¹ããç°ãªããã¹ããã¡ã€ã«ããã®2ã€ã®ãã¹ããã»ãŒåæã«å®è¡ãããå Žåã2çªç®ã®ãã¡ã€ã«ã®ãã¹ããå®è¡äžã«ã1ã€ã®ãã¡ã€ã«ã®åãæšãŠããã¯ãéå§ããããã®ãã¹ããå°ç¡ãã«ãªãå¯èœæ§ããããŸãã
æåŸã«ãKnexã§ãã©ã³ã¶ã¯ã·ã§ã³ãã©ã®ããã«æ©èœãããã«ã€ããŠã¯ãŸã ã¯ã£ããããŠããŸããã knex.transaction()
ã§trx
ãäœæããå Žåã trx
èªåçã«ãã©ã³ã¶ã¯ã·ã§ã³ã®äžéšã«ãªããŸããïŒ æåã§ã³ããã/ããŒã«ããã¯ããå¿
èŠããããŸããïŒ ïŒã¹ããŒããããšã©ãŒããªããšä»®å®ããŸããïŒ
1ã€ã®ãããã§å®è¡ããããã¹ãŠã®ã¯ãšãªãåãæ¥ç¶ã䜿çšããåäžã®ãã©ã³ã¶ã¯ã·ã§ã³ã§ã©ããã§ããããã«ããã©ã³ã¶ã¯ã·ã§ã³ã®æéäžã«æ¥ç¶ã¢ãã£ããã£ãå®çŸããæ¹æ³ã¯ãããŸãããïŒ
ç§ã¯ãããç解ããŠããŸããã§ãã
åãæšãŠæŠç¥ã¯äžçš®ã®æ©èœã§ãããããã¯éåžžã«ãã«ãŒããã©ãŒã¹ã§ãã çŸåšãåãã¹ããã¡ã€ã«ã«test.after.alwaysïŒïŒããã¯ãããããã®ãã¡ã€ã«å ã®ãã¹ãã®åœ±é¿ãåããããŒãã«ïŒéåžžã¯ãã¡ã€ã«ããšã«1ã€ã®ããŒãã«ïŒãåãæšãŠãŠããŸãããããã«ãã£ãŠå°ç¡ãã«ãªããšããžã±ãŒã¹ãèããããšãã§ããŸãã
ããšãã°ãåãããŒãã«ã«ã¢ã¯ã»ã¹ããç°ãªããã¹ããã¡ã€ã«ããã®2ã€ã®ãã¹ããã»ãŒåæã«å®è¡ãããå Žåã2çªç®ã®ãã¡ã€ã«ã®ãã¹ããå®è¡äžã«ã1ã€ã®ãã¡ã€ã«ã®åãæšãŠããã¯ãéå§ããããã®ãã¹ããå°ç¡ãã«ãªãå¯èœæ§ããããŸãã
ãã©ã³ã¶ã¯ã·ã§ã³ã䜿çšããŠãã¹ãããŒã¿ããªã»ããããŠããå Žåã§ããéåžžãè€æ°ã®ãã¹ãã䞊è¡ããŠå®è¡ããããšã¯ã§ããŸããã IDã·ãŒã±ã³ã¹ãç°ãªãããã©ã³ã¶ã¯ã·ã§ã³ããããããã¯ããå¯èœæ§ããããŸãã
æåŸã«ãKnexã§ãã©ã³ã¶ã¯ã·ã§ã³ãã©ã®ããã«æ©èœãããã«ã€ããŠã¯ãŸã ã¯ã£ããããŠããŸããã knex.transactionïŒïŒã䜿çšããŠtrxãäœæããå Žåãtrxã䜿çšããŠå®è¡ããããã¹ãŠã®ã¯ãšãªã¯èªåçã«ãã©ã³ã¶ã¯ã·ã§ã³ã®äžéšã«ãªããŸããïŒ æåã§ã³ããã/ããŒã«ããã¯ããå¿ èŠããããŸããïŒ ïŒã¹ããŒããããšã©ãŒããªããšä»®å®ããŸããïŒ
ããã¯ããã¥ã¡ã³ãããèŠã€ãããŸãã knex.transaction(callback)
ã³ãŒã«ããã¯ããpromiseãè¿ããªãå Žåã¯ãæåã§ã³ããã/ããŒã«ããã¯ããå¿
èŠããããŸãã ã³ãŒã«ããã¯ãpromiseãè¿ãå Žåãcommit / rollbackãèªåçã«åŒã³åºãããŸãã ããªãã®å Žåãããããæåã§ããŒã«ããã¯ããå¿
èŠããããŸãã
ãã©ã³ã¶ã¯ã·ã§ã³ã䜿çšããŠãã¹ãããŒã¿ããªã»ããããŠããå Žåã§ããéåžžãè€æ°ã®ãã¹ãã䞊è¡ããŠå®è¡ããããšã¯ã§ããŸããã IDã·ãŒã±ã³ã¹ãç°ãªãããã©ã³ã¶ã¯ã·ã§ã³ããããããã¯ããå¯èœæ§ããããŸãã
æ¿å ¥ããã¬ã³ãŒãããšã«ã©ã³ãã ã«IDãçæããŠããŸãã è¡çªã¯çºçããå¯èœæ§ããããŸãããçºçããå¯èœæ§ã¯äœãã1æ¥ã«1åçºçããå Žåã¯ãåãªããã¹ãã§ããã顧客åãã®ã³ãŒãã§ã¯ãããŸããã
åæå®è¡æ§ã«é¢ããŠã¯ãåäžã®ãã©ã³ã¶ã¯ã·ã§ã³ã«ã°ã«ãŒãåããå¿
èŠããããã¹ãŠã®ã¯ãšãªãåãDBæ¥ç¶ã䜿çšããå¿
èŠããããšæ³å®ããŠããŸããããã¯ãKnexããŒã«ãµã€ãºã1ã«èšå®ããããšã§å®çŸã§ããŸãã次ã«ããã¹ããè¡ãå¿
èŠããããŸãã .serial
修食åã䜿çšãããã¡ã€ã«ã·ãªã¢ã«ã ãã ããAvaã¯åãã¹ããã¡ã€ã«ãåå¥ã®åããã»ã¹ã§å®è¡ããããããã¹ããã¡ã€ã«éã®åæå®è¡æ§ïŒããã©ãŒãã³ã¹ã®æãéèŠãªèŠçŽ ïŒããããŸãã
ç§ã¯ãããè©ŠããŠã¿ãã¹ãã ãšæããŸãã
åäœããŸããïŒ
https://gist.github.com/odigity/7f37077de74964051d45c4ca80ec3250
ãããžã§ã¯ãã®åäœãã¹ãã«Avaã䜿çšããŠããŸããããã®äŸã§ã¯ãæŠå¿µã瀺ãããã«ãååŸã®ããã¯ã䜿çšããŠæš¡æ¬åäœãã¹ãã·ããªãªãäœæããŸããã
ããã¯å
before
ããã¯ããæ»ãæ°ããPromiseãäœæãããã®resolve
ã¡ãœããããã£ããã£ããŠã transaction()
ã³ãŒã«ããã¯ã§åŒã³åºãããšãã§ããããã«ããŸããtx
ãã³ãã«ãããã¹ããšafter
ããã¯ã«ã¢ã¯ã»ã¹ã§ããå Žæã«ä¿åããŸãresolve
ã¡ãœãããåŒã³åºããŠãããã¹ããã¬ãŒã ã¯ãŒã¯ãã«before
ããã¯ãå®äºãããã¹ããéå§ã§ããããšãéç¥ããŸãããã¹ãâä¿åãããtx
ãã³ãã«ã䜿çšããŠ2ã€ã®æ¿å
¥ã¯ãšãªãå®è¡ããŸãã
ããã¯åŸâä¿åãããtx
ãã³ãã«ã䜿çšããŠãã©ã³ã¶ã¯ã·ã§ã³ãããŒã«ããã¯ãããã¹ãäžã«è¡ããããã¹ãŠã®å€æŽãå
ã«æ»ããŸãã ããŒã¿ã¯ã³ããããããªããããä»ã®ãã¹ãã®ã¢ã¯ãã£ããã£ã«ãã£ãŠè¡šç€ºããããã劚害ããããããããšã¯ãããŸããã
Knex
Knexã§ã¯ãæ¥ç¶ããŒã«ãµã€ãºã®ãªãã·ã§ã³ãæå®ã§ããŸãã ãã©ã³ã¶ã¯ã·ã§ã³å ã®ãã¹ãŠã®ã¯ãšãªãåãæ¥ç¶ã§å®è¡ãããããã«ããå¿ èŠãããå ŽåïŒç§ã¯ããããŠãããšæããŸãïŒãããŒã«ãµã€ãºã1ã«èšå®ããããšã§ãããå®çŸã§ããŸãã
_ãããåŸ ã£ãŠãã ãã..._ãœãŒã¹ã§ãã®ã³ã¡ã³ãããã§ãã¯ããŠãã ããïŒ
// We need to make a client object which always acquires the same
// connection and does not release back into the pool.
function makeTxClient(trx, client, connection) {
ç§ããããæ£ããç解ããŠããã°ãããŒã«ã1ãã倧ããå Žåã§ãããã©ã³ã¶ã¯ã·ã§ã³å ã®ãã¹ãŠã®ã¯ãšãªãåãæ¥ç¶ãééããããšãä¿èšŒããããã«Knexãä¿¡é Œã§ããããšãæå³ããŸãã ãããã£ãŠãã·ããªãªã§ãã®ç¹å®ã®åæå®è¡æ§ãç ç²ã«ããå¿ èŠã¯ãããŸããã
ãšããã§âããã¥ã¡ã³ãã¯ãããããã®æ¬è³ªçã§çŽ æŽãããäºå®ãåæ ããŠããã¯ãã§ãã
ãšã€ã
_Knexåºæã§ã¯ãªãAvaåºæã§ããããšã¯ç¥ã£ãŠããŸãããããã¯äººæ°ã®ãããã¬ãŒã ã¯ãŒã¯ã§ãããã¬ãã¹ã³ã¯ã»ãšãã©ã®ãã¬ãŒã ã¯ãŒã¯ã«åºãé©çšã§ããŸãã_
Avaã¯ãåãã¹ããã¡ã€ã«ãå¥ã
ã®ããã»ã¹ã§åæã«å®è¡ããŸãã åããã»ã¹å
ã§ããã¹ãŠã®ãã¹ããåæã«å®è¡ããŸãã äž¡æ¹ã®åœ¢åŒã®äžŠè¡æ§ã¯ã --serial
CLIãªãã·ã§ã³ïŒãã¹ãŠãã·ãªã¢ã«åããïŒãŸãã¯test
ã¡ãœããã®.serial
修食åïŒæ®ããåæã«å®è¡ããåã«ããŒã¯ããããã¹ããã·ãªã¢ã«åããïŒã䜿çšããŠç¡å¹ã«ã§ããŸãïŒã
èŠçŽ
ããããã¹ãŠã®äºå®ããŸãšãããšã次ã®ããã«ãªããŸãã
åãã¹ãããã©ã³ã¶ã¯ã·ã§ã³ã§ã©ããã§ããŸããããã«ãããïŒaïŒãã¹ãããŒã¿ã®éè¡çªïŒbïŒåãæšãŠãå移è¡ãªãã®ãã¹ãåŸã®èªåã¯ãªãŒã³ã¢ãããä¿èšŒãããŸãã å®éããã®æŠç¥ã䜿çšãããšãç§ã®ãã¹ãDBã«ã¯ãããããå¿ é ã®ã·ãŒãããŒã¿ãé€ããŠãæåéãåäžã®ã¬ã³ãŒããä¿æãããããšã¯ãããŸããã
åãã¹ããã¡ã€ã«ã¯å¥ã ã®ããã»ã¹ã§å®è¡ãããç¬èªã®Knexæ¥ç¶ããŒã«ãæã€ãããAvaã®ãã¹ããã¡ã€ã«éã®åæå®è¡æ§ã®æ©æµãåãç¶ããããšãã§ããŸãã
æ¥ç¶ããŒã«ããã¡ã€ã«å ã®ãã¹ãã®æ°ä»¥äžã§ããããšã確èªããã°ãAvaã®ãã¹ããã¡ã€ã«å åæå®è¡æ§ã®æ©æµãåãç¶ããããšãã§ããŸãã ããã¯åé¡ã§ã¯ãªãã¯ãã§ãã1ã€ã®ãã¡ã€ã«ã«èšå€§ãªæ°ã®ãã¹ããå ¥ããªãã®ã§ããšã«ããé¿ããããšããŸãã ãŸããããŒã«ã¯1ã10ã®ãããªç¯å²ã§èšå®ã§ãããããäžèŠãªæ¥ç¶ãäœæããå¿ èŠã¯ãããŸãããããã¹ããè¿œå ãŸãã¯åé€ãããã³ã«åãã¹ããã¡ã€ã«ã®å®æ°ã調æŽããå¿ èŠã¯ãããŸããã
åæã«æ°ãããã¯ãããžãŒã®äº€å·®ç¹ã«æãåºããŠããã®ã§ãä»ã®äººã®èããç¥ãããã£ãŠããŸã...
@odigityãããknexã®ãã©ã³ã¶ã¯ã·ã§ã³ã¯ãtrxã€ã³ã¹ã¿ã³ã¹ãäœæããããšãã«knexãèªåçã«BEGIN
ã¯ãšãªãè¿œå ããå°çšæ¥ç¶ãžã®ãã³ãã«ã«ãããŸããïŒå®éãSQLã®ãã©ã³ã¶ã¯ã·ã§ã³ã¯éåžžãBEGINãåã«ä»ããåãæ¥ç¶ã«åããã¯ãšãªã§ãïŒã
knexããã©ã³ã¶ã¯ã·ã§ã³ã«æ¥ç¶ãå²ãåœãŠãªãå Žåããã©ã³ã¶ã¯ã·ã§ã³ã¯ãŸã£ããæ©èœããŸããã
uuidããŒã䜿çšããããšãæªããããŸãããå®éã«å€ãã®è¡ããªãéããè¡çªãå€åããå¯èœæ§ã¯ã»ãšãã©ãããŸããã ïŒã128ãããã®UUIDã䜿çšããå Žåããèªçæ¥ã®å¹æãã¯ãåããŒã«128ãããã®ãšã³ããããŒãããå ŽåãçŽ2 ^ 64ã®ããŒãçæããåŸã«è¡çªãçºçããå¯èœæ§ãããããšã瀺ããŠããŸãããïŒ
ããªãã¯ããªãã®çããç解ãããšæãã®ã§ããããéããŸãð
åéããŠç³ãèš³ãããŸããããäºæããªãåäœãèŠãããŸãã å ·äœçã«ã¯ãããã¹ãã§ã¯ãªããšãã«æ©èœããŠããã®ã§ãç§ã®ç解ãä¿®æ£ããå¿ èŠããããŸãã
ããŒã«ãµã€ãºã1ã«èšå®ããå Žåããã©ã³ã¶ã¯ã·ã§ã³ãéããããã䜿çšããã«ã¯ãšãªãå®è¡ãããšãæ¥ç¶ãååŸã§ããªãããã«ã¿ã€ã ã¢ãŠãã«ãªããŸããããã¯ããã®æ¥ç¶ããã©ã³ã¶ã¯ã·ã§ã³ã«ãã£ãŠãã§ã«ããã¯ãããŠããããã§ãã
ãã ããããŒã«ãµã€ãºã1ã«èšå®ãã4ã€ã®ãã¹ããåæã«å®è¡ãããšãããããã次ã®ããã«ãªããŸãã
ãããã¯ãã¹ãŠæ©èœããŸãã ãããã¯æ©èœããªãã¯ãã§ã-å°ãªããšããããã®ããã€ãã¯æ¥ç¶äžè¶³ã«ãã£ãŠããã¯ã¢ãŠããããã¯ãã§ã-ããããããã¯ãã¹ãŠæ¯åæ£åžžã«æ©èœããŸãã
Knexã«ã¯ããã®æç¹ã§äœ¿çšå¯èœãªæ¥ç¶ããªãå Žåã®ã¯ãšãªã®ãã¥ãŒã€ã³ã°ãçµã¿èŸŒãŸããŠããŸããïŒ ãããããªããétxã¯ãšãªãå®è¡ããåã«ãã©ã³ã¶ã¯ã·ã§ã³ãçµäºããã®ãåŸ ã€ã®ã§ã¯ãªãããªãç§ã®æåã®äŸã倱æããã®ã§ããïŒ
ãŸãã¯ãKnexã¯ã©ããããããè€æ°ã®åæãã©ã³ã¶ã¯ã·ã§ã³ãåäžã®æ¥ç¶ã«å€éåããŸããïŒ
ãããšããKnexã¯å®éã«2åç®ã3åç®ã4åç®ã®åŒã³åºãã§ãµããã©ã³ã¶ã¯ã·ã§ã³ãäœæããŠããŸããïŒ ãããããªããããã¯ããããã©ã³ãã ã«æåŸ ãããçµæãåŒãèµ·ããã§ããã...
@odgityæåã®ã±ãŒã¹ã§ã¯ãã¢ããªã±ãŒã·ã§ã³åŽã®ãããããã¯ãçºçããŸãïŒã¢ããªã¯ãæ¥ç¶ãšacquireConnectionã¿ã€ã ã¢ãŠãããªã¬ãŒã®åŸ æ©ã§ã¹ã¿ãã¯ããŸãïŒã
2çªç®ã®ã±ãŒã¹ã§ã¯ã1人ãé€ãå šå¡ãæ¥ç¶ãåŸ æ©ããŠããããããã¹ãã¯å®éã«ã¯é£ç¶ããŠå®è¡ãããŸãã ããã䞊è¡ããŠå®è¡ããååãªãã¹ããããå ŽåããŸãã¯ãã¹ãã±ãŒã¹ãæ¬åœã«é ãå Žåã¯ã2çªç®ã®ã±ãŒã¹ã§ãacquireConnectionTimeoutãããªã¬ãŒãããŸãã
åäžæ¥ç¶ã§ãã©ã³ã¶ã¯ã·ã§ã³ãå€éåããããšã¯ã§ããŸããã ãã¹ããã©ã³ã¶ã¯ã·ã§ã³ã¯ããã©ã³ã¶ã¯ã·ã§ã³å ã®ã»ãŒããã€ã³ãã䜿çšããknexã«ãã£ãŠãµããŒããããŸãã ããŒã«ããã®æ°ãããã©ã³ã¶ã¯ã·ã§ã³ãèŠæ±ããŠããå ŽåãçºçããŸããã
ããããšããããã¯æ¬åœã«åœ¹ã«ç«ã¡ãŸãã
éããŠãããã©ã³ã¶ã¯ã·ã§ã³ã«ãã£ãŠæ¥ç¶ã確ç«ããããšãã«ã¯ãšãªã®å®è¡ãããã¯ãããçç±ã«ã€ããŠã¯ãŸã å°ãæ··ä¹±ããŠããŸããã2çªç®ã®æ°ãããã©ã³ã¶ã¯ã·ã§ã³ãéãããšãããšãèŸæ±åŒ·ãåŸ ã£ãŠããå®äºããŸãã
DEBUG = knexïŒ*ç°å¢å€æ°ã䜿çšããŠã³ãŒããå®è¡ãããšãããŒã«ãäœãããŠããããããããŸãã Knexã¯ãæåã®ã±ãŒã¹ã§ãããæ¥ç¶ãååŸã§ããŸããã§ãããã¿ã€ã ã¢ãŠããçºçãããŸã§åŸ æ©ããå¿ èŠããããŸãã ãããã£ãŠã2çªç®ã®æ¥ç¶ãååŸããããŸã§ãã©ã³ã¶ã¯ã·ã§ã³ãåŸ æ©ããŠããå Žåãäž¡æ¹ã®æ¥ç¶ãçžäºã«åŸ æ©ããŠãããããã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã®ãããããã¯ã«ãªããŸãïŒãã ãããããåœãŠã¯ãŸããã©ããã¯ããããŸããïŒã
ãã®ã¹ã¬ããã¯ãšãŠã䟿å©ã ãšæããŸããã ä»ã®äººãã·ã¹ãã ã®ç¶æ ãæ±æããªããã¹ããæžãããšã«é¢å¿ãæã£ãŠããã®ãèŠãã®ã¯ããããã§ãã ç§ã¯ããã¹ãã®å®äºåŸã«ããŒã«ããã¯ããknexã䜿çšããã³ãŒãã®ãã¹ããäœæã§ãããããžã§ã¯ããéå§ããŸããã
@ bas080ã¯äžè¬çã«ããã®ã¢ãããŒãã§ã¯ãã¹ãã§ãããã®ãå¶éãããŸãïŒãã¹ãã§åäžã®ãã©ã³ã¶ã¯ã·ã§ã³ã®ã¿ã䜿çšã§ããããã«ããŸãïŒã è€æ°ã®æ¥ç¶/åæãã©ã³ã¶ã¯ã·ã§ã³ã䜿çšããã³ãŒãã®ãã¹ããé²ããŸãã ãŸãããã®æ¹æ³ã§æé»çãªã³ããããè¡ãã³ãŒãããã¹ãããããšã¯ã§ããŸããïŒãã ããããŸãäžè¬çã§ã¯ãããŸããïŒã
ãã¹ãã®å®è¡åŸã«ãã©ã³ã¶ã¯ã·ã§ã³ã䜿çšããŠç¶æ ããªã»ããããããšã¯ããªãäžè¬çãªãã¿ãŒã³ã§ããããšãç§ã¯ç¥ã£ãŠããŸãã匷調ãããã®ã¯ããã®ã¢ãããŒãã®ã¿ã䜿çšãããšãç¹å®ã®ãã®ããã¹ãã§ããªããšããããšã§ãã
ç§ã¯åžžã«ãããŒã¿ãå€æŽããåãã¹ãã®åŸããŸãã¯çžäºã«äŸåããããã€ãã®ãã¹ãã®ã»ããã®åŸã«DBãåãæšãŠãŠåå ¥åããããšã奜ã¿ãŸããïŒå ¥åã«50ããªç§ä»¥äžãããå Žåã¯ãããã©ãŒãã³ã¹äžã®çç±ã§ãããè¡ãããšããããŸãïŒã
ããã«ã¡ã¯ããã®åé¡ãå床éããŠç³ãèš³ãããŸããããç§ã¯knexã_åœã®ããŒã¿ãå«ãè€æ°ã®ããŒã¿ããŒã¹ãã·ãŒãããããã®CLIã§ããæ°ãããããžã§ã¯ããéå§ããŸãã_ãããèŠãŠãããã€ãã®è²¢ç®ãæäŒã£ãŠã»ãã
åäœãã¹ãã§ã¯ãã¯ãšãªãã§ãŒã³ã®æåŸã§toString()
ã䜿çšããŠãSQLã©ãããŒããKnexã«ãã£ãŠå®è¡ãããã¯ãšãªãæ£ãã圢æãããŠããããšã確èªããŠããã ãã§ãã çµ±åãã¹ãã§ã¯ããã¹ãŠã®ãã¹ãã®åã«ãäžèšã®æŠç¥ãæ¡çšããŠããŸããã€ãŸãããµã€ã¯ã«ããã¯->移è¡->ã·ãŒãã§ãã åœç¶ã®ããšãªãããã·ãŒãããŒã¿ãå°ããä¿ã€ããšãã§ããªãå Žåã¯é
ãããå¯èœæ§ããããŸãããä»ã®äººã«ã¯é©ããŠããå¯èœæ§ããããŸãã
ã€ãŸãããã¹ãŠã®ãã¹ãã®åã«ãããŒã«ããã¯->移è¡->ã·ãŒãã埪ç°ãããŸãã
ããã¯æ¬åœã«æªãæ¹æ³ã§ãã 移è¡ã®å®è¡ã«ã¯æ°çŸããªç§ããããŸãããããã¯é ãããŸãã ãã¹ãã¹ã€ãŒãå šäœã«å¯ŸããŠäžåºŠã ã移è¡ãå®è¡ãããã¹ãã®åã«ãã¹ãŠã®ããŒãã«ãåãæšãŠãŠé©åãªãã¹ãããŒã¿ãå ¥åããå¿ èŠããããŸããã¹ããŒãå šäœãããŒã«ããã¯/åäœæããããã100åéãç°¡åã«å®è¡ã§ããŸãã
knex-cleanerã䜿çšãããšããã¹ãŠã®ããŒãã«ãç°¡åã«åãæšãŠãããšãã§ããŸãã
knexCleaner
.clean(knex, { ignoreTables: ['knex_migrations', 'knex_migrations_lock'] })
.then(() => knex.seed.run())
åãã¹ãã¹ã€ãŒãã®å®è¡ã®éå§æã«ç§»è¡ãå®è¡ããŠããå Žåã¯ã ignoreTables
éšåã䜿çšããå¿
èŠããªãããšã«æ³šæããŠãã ããã ããã¯ããã¹ãããŒã¿ããŒã¹ã§æåã§ç§»è¡ãå®è¡ããå Žåã«ã®ã¿å¿
èŠã§ãã
@ricardogracaå€éšããŒã®ããã±ãŒã¹ãããŸãåŠçããŸããïŒ ïŒåé€é åºãééã£ãŠããããã«ã¯ãªãŒãã³ã°ã倱æããªãããšãæå³ããŸãïŒ
ããã§ãªãå Žåã¯ãç°¡åã«ä¿®æ£ã§ããŸãïŒ1ã€ã®ã¯ãšãªã§ãã¹ãŠã®ããŒãã«ãåãæšãŠãå¿ èŠããããŸãïŒ:)
@elhiguã©ãããã°ãããã§ããŸããïŒ
ããŒã¿ããŒã¹ã«ãã£ãŠç°ãªããŸãããããšãã°æ¬¡ã®ããã«ãªããŸãïŒ https ïŒ
@kibertoadã¯ããå€éšããŒå¶çŽã
@odigityãã®ãããªæ§é ããã¹ãããå Žåã¯ã©ããªããŸããïŒ
// controller.js
const users = require('./usersModel.js');
module.exports.addUser = async ({ token, user }) => {
// check token, or other logic
return users.add(user);
};
// usersModel.js
const db = require('./db');
module.exports.add = async user => db('users').insert(user);
// db.js
module.exports = require('knex')({ /* config */});
ãã©ã³ã¶ã¯ã·ã§ã³ãå®éã®ã¯ãšãªãã«ããŒã«æž¡ãã«ã¯ããã¹ãŠã®é¢æ°ã«è¿œå ã®åŒæ°ïŒããšãã°ã trx
ïŒãå¿
èŠã§ãã
https://knexjs.org/#Builder -transacting
ç§ã¯æ£ããæ¹æ³ã¯ãã®ãããªãã®ã§ãªããã°ãªããªããšæããŸãïŒ
beforeEach
trxãäœæããŸããrequire('./db')
trxå€ãè¿ããŸããããããç§ã¯ãããknexã§å¯èœãã©ããããããŸãããïŒ
ã³ãŒããå¥ã®ãã©ã³ã¶ã¯ã·ã§ã³ã䜿çšããå Žåã¯ã©ããªããŸããïŒ
ãŸããå¥ã®ãªãã·ã§ã³ïŒã¯ãšãªã®å®è¡ãéå§ããé¢æ°ããããããããŸããã ãããã£ãŠãããããªãŒããŒã©ã€ãããŠããã¹ããã©ã³ã¶ã¯ã·ã§ã³ã§åŒ·å¶çã«å®è¡ããããšãã§ããŸãã
knexã³ãŒããèªãã åŸãç§ã¯ãã®ã¢ãããŒããè©ŠããŸãã
test.beforeEach(async t => {
// if we use new 0.17 knex api knex.transaction().then - we can not handle rollback error
// so we need to do it in old way
// and add empty .catch to prevent unhandled rejection
t.context.trx = await new Promise(resolve => db.transaction(trx => resolve(trx)).catch(() => {}));
t.context.oldRunner = db.client.runner;
db.client.runner = function(builder) {
return t.context.oldRunner.call(t.context.trx.client, builder);
};
t.context.oldRaw = db.raw;
db.raw = function(...args) {
return t.context.oldRaw.call(this, ...args).transacting(t.context.trx);
};
});
test.afterEach(async t => {
db.raw = t.context.oldRaw;
db.client.runner = t.context.oldRunner;
await t.context.trx.rollback();
});
ãããŠããã¯ã¡ãã£ãšããŸããããŸãã äžæžãç§ã¯.raw
ãš.client.runner
ã¡ãœãããã .client.runner
ã¯ãã¯ãšãªãã«ããŒã.then
ãããšãå
éšçã«åŒã³åºãããŸãã ãã®é¢æ°ã®db
ã¯knexã¯ã©ã€ã¢ã³ãknex({ /* config */})
ã§ãã
@Niklvã¯ããã§ã«ããã§èª¬æããŸããã ãã©ã³ã¶ã¯ã·ã§ã³ã䜿çšããŠãã¹ãããŒã¿ããªã»ããããããšã¯äžè¬çã«æªãèãã§ãããã¢ã³ããã¿ãŒã³ãšããèŠãªããŸãã ãããã£ãŠãknexã®å éšããªãŒããŒã©ã€ãããŸãã ãã¹ãŠã®ãã¹ããŸãã¯äžé£ã®ãã¹ãã§dbãåãæšãŠãŠåå ¥åããããšããå§ãããŸãã ãã¹ãããŒã¿ã®ãµã€ãºãé©åã§ããã°ãå®è¡ã«æ°ããªç§ã¯ããããŸããã
æãåèã«ãªãã³ã¡ã³ã
ããããäœããããŸããã ãœãŒã¹ã®æç³»åé ã§ã®èŠçŽïŒ
2016-04-21 https://medium.com/@jomaora/knex -bookshelf-mocks-and-unit-tests-cca627565d3
æŠç¥ïŒã¢ãã¯ãã€ãã䜿çšããŸãã DBãã¢ãã¯ããããªã-å®éã®MySQLDBã«å¯ŸããŠã¡ãœããããã¹ãããŠæ£ããåäœã確èªããã-ãšã«ãã
mock-knex
調ã¹ã...ããã¯ææªã®èšèšã®ã©ã€ãã©ãªãããããªãç§ã¯ä»ãŸã§ã«ééããããšããããŸãã :(2016-04-28 http://mherman.org/blog/2016/04/28/test-driven-development-with-node/
æŠç¥ïŒåãã¹ãåŸã«DBãããŒã«ããã¯/å移è¡/åã·ãŒãããŸãã ããã¯ãåãã¹ãã®ãªãŒããŒãããã倧ããããã«æãããå®è¡é床ãéåžžã«é ããªããŸãã åæå®è¡æ§ã¯ãåãã¹ãã®DBåã«å¯ŸããŠUUIDãçæããããšã§å®çŸã§ããŸãããããã¯ãã©ã³ã¶ã¯ã·ã§ã³ã®åªé ãã«æ¯ã¹ãã°ã²ã©ã解決çã®ããã«æããŸã...
2015-09-23 http://stackoverflow.com/a/32749601/210867
æŠç¥ïŒãã¹ãã«ã¯sqliteã䜿çšãããã¹ãããšã«DBãäœæ/ç Žæ£ããŸãã äžèšã®ãã®ã¢ãããŒããå«ããªçç±ã®äž¡æ¹ã«ã€ããŠèª¬æããŸããã
ããã§...ãŸã ææ¡ãæ¢ããŠãããKnexãã©ã³ã¶ã¯ã·ã§ã³ãå®éã«ã©ã®ããã«æ©èœããããããã³ããããç§ã®ãŠãŒã¹ã±ãŒã¹ã«é©åã«é©çšããæ¹æ³ã«é¢ããè¿œå ã®ã¬ã€ãã³ã¹ãæ¢ããŠããŸãã