į§ãŽčŦæŧã§ã¯ãį§ģčĄãįŽĄįãããããŽåŽį¸žãŽããããŧãĢã§ããAlembicãäŊŋį¨ããįĩé¨ãå ąæããžããã Alembicã鏿ããįįąããããäŊŋį¨ããĻį§ģčĄãæēåããæšæŗãããããīŧčĒåãžãã¯æåã§īŧåŽčĄããæšæŗãä¸å¯éįãĒ夿´ãŽåéĄãč§Ŗæąēããæšæŗãį§ģčĄãããšãããįįąãããšãã§æãããĢã§ããåéĄããããŗããããåŽčŖ ããæšæŗ-į§ã¯ãããããšãĻãŽčŗĒåãĢįãããã¨ããžãããåæãĢãAlembicã§ãŽį§ģčĄäŊæĨãį°Ąåã§æĨŊããããŽãĢããããã¤ããŽãŠã¤ãããã¯ãå ąæããžããã
ãŦããŧããŽæĨäģĨéãGitHubãŽãŗãŧããããããĢæ´æ°ããããããĢå¤ããŽäžããããžãããšãŠã¤ããĢ襨į¤ēãããĻããã¨ãããĢãŗãŧããįĸēčĒãããå ´åã¯ãããŽæįšãããŽãŗãããã¸ãŽãĒãŗã¯ãæŦĄãĢį¤ēããžãã
- ãããĢãĄã¯īŧį§ãŽååã¯ãĸãŦã¯ãĩãŗããŧã§ããã¨ãããŖãĢã§åããĻããžããäģæĨã¯ãį§ããĄããŠãŽãããĢį§ģčĄã¨å ąåãããŠãŽãããĢį§ģčĄã¨å ąåã§ããããã芹ããããã¨æããžããããããããã¯ããĒããããį°ĄåãĢæŽãããŽãĢåŊšįĢã¤ã§ãããã
į§ģčĄã¨ã¯äŊã§ããīŧ
å§ããåãĢãä¸čŦįãĒį§ģčĄãĢã¤ããĻčĒŦæãã䞥å¤ããããžãããã¨ãã°ããĸããĒãąãŧãˇã§ãŗãããããããæŠčŊãããããĢããã¤ããŽãŋããŦãããäŊæããããããĢãĸã¯ãģãšããžããæŦĄãĢãäŊãã夿´ãããæ°ããããŧã¸ã§ãŗãããŧãĢãĸãĻãããžããæåãŽããŦãŧãã夿´ããã2įĒįŽãŽããŦãŧãã¯å¤æ´ãããĻãããã3įĒįŽãŽããŦãŧãã¯äģĨåã¯ãããžããã§ãããã襨į¤ēãããžããã
æŦĄãĢããĸããĒãąãŧãˇã§ãŗãŽæ°ããããŧã¸ã§ãŗã襨į¤ēãããä¸é¨ãŽããŦãŧããåé¤ãããæŽããŽããŦãŧããĢã¯äŊãčĩˇãããžãããããã¯äŊã§ããīŧãããį§ģčĄã§čĄ¨įžã§ããįļæ ã¨č¨ããžããããįļæ ããåĨãŽįļæ ãĢį§ģčĄããã¨ããããã¯ãĸããã°ãŦãŧãã§ãããæģãããã¨ãã¯ããĻãŗã°ãŦãŧãã§ãã
į§ģčĄã¨ã¯äŊã§ããīŧ
䏿šã§ã¯ãããã¯ããŧãŋããŧãšãŽįļæ ã夿´ãããŗãŧãã§ãã䏿šãããã¯į§ããĄãéå§ãããããģãšã§ãã
į§ģčĄãĢã¯ãŠãŽãããĒãããããŖãåŋ čĻã§ããīŧãĸããĒãąãŧãˇã§ãŗãŽããŧã¸ã§ãŗã§åãæŋããįļæ ããĸãããã¯ã§ãããã¨ãéčĻã§ãããã¨ãã°ã2ã¤ãŽããŧããĢãåŋ čĻãĒãŽãĢã1ã¤ãã襨į¤ēãããĒãå ´åãããã¯æŦįĒį°åĸã§ããžãč¯ãįĩæããããããĒãå¯čŊæ§ããããžãã
夿´ãããŧãĢããã¯ã§ãããã¨ãéčĻã§ããæ°ããããŧã¸ã§ãŗãããŧãĢãĸãĻãããå ´åãããã¯éĸé¸ãããããŧãĢããã¯ã§ãããé常ãããšãĻãã˛ãŠãįĩäēããžãã
ãžããããŧã¸ã§ãŗãé įĒãĢä¸ĻãšãĻãããŧãĢããæšæŗãéŖéããããã¨ãéčĻã§ãã
ããŧãĢ
ããããŽį§ģčĄããŠãŽãããĢåŽčŖ ã§ããžããīŧ
é ãĢæĩŽããļæåãŽãĸã¤ããĸīŧããĻãį§ģčĄã¯SQLã§ããã¯ã¨ãĒãäŊŋį¨ããĻSQLããĄã¤ãĢãäŊæããĻãŋãžããããį§ããĄãŽįæ´ģãæĨŊãĢãããã¨ãã§ããããã¤ããŽãĸã¸ãĨãŧãĢããããžãã
å é¨ã§äŊãčĩˇããŖãĻããããčĻãã¨ãįĸēããĢããã¤ããŽčĻæąããããžããããã¯CREATETABLEãALTERãããŽäģäŊã§ãããžããžããã downgrade_v1.sqlããĄã¤ãĢã§ã¯ãããšãĻããŖãŗãģãĢããžãã
ãĒãããĒãã¯ãããããšãã§ã¯ãĒããŽã§ããīŧä¸ģãĢããĒããããĒããŽæã§ãããããåŋ čĻãããããã§ãã beginãč¨čŋ°ããĻããã夿´ããŗããããããã¨ãåŋããĒãã§ãã ããããŗãŧããæ¸ãã¨ãã¯ãããšãĻãŽäžåéĸäŋã¨äŊããŠãŽé åēã§čĄãããčĻããĻããåŋ čĻããããžããããã¯ããĒãæĨ常įã§ãå°éŖã§æéãŽãããäģäēã§ãã
čǤãŖãĻééãŖãããĄã¤ãĢãčĩˇåãããã¨ãĢ寞ããäŋčˇã¯ãããžãããããšãĻãŽããĄã¤ãĢãæåã§åŽčĄããåŋ čĻããããžãã 15åãŽį§ģčĄãããå ´åãããã¯į°Ąåã§ã¯ãããžãããããã¤ããŽpsqlã15ååŧãŗåēãåŋ čĻããããžããããããģãŠã¯ãŧãĢã§ã¯ãããžããã
æãéčĻãĒãã¨ã¯ãããŧãŋããŧãšããŠãŽãããĒįļæ ãĢããããããããĒããã¨ã§ããããĻãŗããŧãããããĄã¤ãĢã¨ããĻãŗããŧãããĒããŖãããĄã¤ãĢããŠãããĢīŧį´ãĢããŠãããĢīŧæ¸ãįããåŋ čĻããããžããããžãč¯ããĒãã§ãããyoyo-migrations
ãĸã¸ãĨãŧãĢããããžããæãä¸čŦįãĒããŧãŋããŧãšããĩããŧãããįââãŽã¯ã¨ãĒãäŊŋį¨ããžãã åŊŧãį§ããĄãĢæäžããããŽãčĻãã¨ãæŦĄãŽãããĢãĒããžããåãSQLã襨į¤ēãããžãã yoyoãŠã¤ããŠãĒãã¤ãŗããŧãããPythonãŗãŧããåŗå´ãĢãã§ãĢãããžãã
ããããŖãĻãæŖįĸēãĢčĒåįãĢį§ģčĄãéå§ã§ããžããã¤ãžããæ°ããį§ģčĄãäŊæããĻãã§ãŧãŗãĢčŋŊå ãããŗããŗãããããããã§SQLãŗãŧããč¨čŋ°ã§ããžãããŗããŗããäŊŋį¨ããĻã1ã¤äģĨä¸ãŽį§ģčĄãéŠį¨ããããããŧãĢããã¯ãããã§ããžããããã¯ãã§ãĢ䏿Šåé˛ããĻããžãã
ãããĢãããŧãŋããŧãšã§åŽčĄãããĒã¯ã¨ãšããčĩˇåããããĄã¤ãĢãäŊããįēįããå ´åãĢããŧãĢããã¯ããåŋ čĻãããå ´æãį´ãĢæ¸ãåŋ čĻããĒããĒããžããããį¨ŽãŽįĩļ寞įĸēåŽãĒäŋčˇããããžããããŧãŋããŧãšãŽäģãŽ2ã¤ãŽįļæ éãŽį§ģčĄãŽãããĢãäģãŽįŽįã§č¨č¨ãããį§ģčĄãéå§ã§ããĒããĒããžããé常ãĢ大ããĒããŠãšīŧããã¯ãååĨãŽããŠãŗãļã¯ãˇã§ãŗã§åį§ģčĄãåŽčĄããžããããã¯ãžãããŽãããĒäŋč¨ŧãä¸ããžãã
æŦ įšã¯æããã§ããããĒãã¯ãžã įãŽSQLãæãŖãĻããžãããã¨ãã°ãPythonã§ãã¸ãã¯ãåē大ãĒ大čĻæ¨ĄãĒããŧãŋãįæããĻããå ´åãSQLãããĒãããããããäŊŋį¨ãããã¨ã¯ã§ããžããã
ãžããčĒååã§ããĒãæĨ常æĨåããããããããžããããŧããĢéãŽããšãĻãŽéĸäŋīŧãŠãããĢæ¸ãčžŧããã¨ãã§ããããŽã¨ããžã ä¸å¯čŊãĒããŽīŧãčŋŊ补ããåŋ čĻããããžããä¸čŦãĢãé常ãĢæãããĒæŦ įšããããžãã
æŗ¨æãæã䞥å¤ããããäģæĨãŽčŠąå ¨äŊãåãä¸ããããĻãããã1ã¤ãŽãĸã¸ãĨãŧãĢã¯ãAlembicã§ãã
ããã¯yoyoã¨åãããŽããããĻããŖã¨ãããããããžããį§ģčĄãįŖčĻããĻäŊæããæšæŗãįĨãŖãĻããã ãã§ãĒããé常ãĢč¤éãĒãã¸ããšãã¸ãã¯ãč¨čŋ°ããããããŧãŋįæå ¨äŊãPythonãŽäģģæãŽæŠčŊãæĨįļããããããã¨ãã§ããžããåŋ čĻãĢåŋããĻãããŧãŋãããĢããĻå é¨ã§åĻįããžããããããĒãå ´åã¯ãããåŋ čĻã¯ãããžããã
ãģã¨ããŠãŽå ´åãåŊŧã¯čĒåįãĢãŗãŧããæ¸ããã¨ãã§ããžããããĄããã常ãĢã§ã¯ãããžããããæã§ããããæ¸ãåŋ čĻãããŖãåžã¯ãč¯ãããŠãšãŽãããĢčãããžãã
åŊŧã¯ãããããŽã¯ãŧãĢãĒããŽãæãŖãĻããžãããã¨ãã°ãSQLiteã¯ALTERTABLEãåŽå ¨ãĢã¯ãĩããŧãããĻããžããããžããAlembicãĢã¯ããããæ°čĄã§į°ĄåãĢãã¤ããšã§ããæŠčŊããããčãããã¨ãããããžããã
åãŽãšãŠã¤ããĢã¯ãDjango-migrationsãĸã¸ãĨãŧãĢããããžãããããã¯ãį§ģčĄãĢé常ãĢéŠãããĸã¸ãĨãŧãĢã§ããããžããããŽåįã¯ãæŠčŊįãĢã¯AlembicãĢåšæĩããžããå¯ä¸ãŽéãã¯ãããŦãŧã ã¯ãŧã¯åēæã§ãããAlembicã¯ããã§ã¯ãĒããã¨ã§ãã
SQLAlchemy
Alembicã¯SQLAlchemyãĢåēãĨããĻãããããSQLAlchemyãå°ãåŽčĄããĻããããäŊã§ããããčĻãããčĒŋãšãããããã¨ããå§ãããžãã
ãããžã§ãįãŽã¯ã¨ãĒãĢã¤ããĻčĻãĻããžãããįãŽã¯ã¨ãĒã¯æĒããããžãããããã¯ã¨ãĻãč¯ããã¨ã§ããč˛ čˇãŽéĢããĸããĒãąãŧãˇã§ãŗãããå ´åãããããžããĢåŋ čĻãĒããŽãããããžãããä¸é¨ãŽãĒãã¸ã§ã¯ããããį¨ŽãŽã¯ã¨ãĒãĢ夿ããæéãįĄé§ãĢããåŋ čĻã¯ãããžããã
čŋŊå ãŽãŠã¤ããŠãĒã¯åŋ čĻãããžãããããĒãã¯ãã ããŠã¤ããŧãåãã ãã§ãããã ãã§ããããã¯æŠčŊããžãããããããã¨ãã°ãč¤éãĒã¯ã¨ãĒãäŊæããå ´åãããã¯ãããģãŠį°Ąåã§ã¯ãããžããããžããåŽæ°ãååžããĻčĩˇåãã大ããĒ褿°čĄãŽãŗãŧããäŊæãããã¨ãã§ããžããããããããŽãããĒčĻæąã10ã20ããå ´åããã§ãĢčĒããŽã¯é常ãĢå°éŖã§ããããããã¨ãããããååŠį¨ãããã¨ã¯ã§ããžãããããĒãã¯ãããããŽãããšãã¨ãããĄãããæååãfæååãĒãŠãæäŊãããããŽéĸæ°ãæãŖãĻããžãããããã¯ãã§ãĢããžãč¯ãčãããžããããããã¯čĒãŋãĢããã§ãã
ãã¨ãã°ãã¯ã¨ãĒãč¤éãĒæ§é ãåŋ čĻãĒã¯ãŠãšãããå ´åãã¤ãŗããŗãã¯é常ãĢčĻįã§ããįãŽį§ģčĄãčĄãããå ´åãäŊããäŊŋį¨ããĻããå ´æãčĻã¤ããå¯ä¸ãŽæšæŗã¯ãgrepãäŊŋį¨ãããã¨ã§ãããžããåįã¯ã¨ãĒį¨ãŽåįããŧãĢããããžããã
ãã¨ãã°ãé常ãĢį°ĄåãĒãŋãšã¯ã§ããã¨ãŗããŖããŖãããã1ã¤ãŽããŦãŧããĢ15ãŽããŖãŧãĢãããããžãã PATCHãĒã¯ã¨ãšããčĄããããã¨ãĻããˇãŗããĢãĢæããžããįãŽã¯ã¨ãĒã§ãããæ¸ããĻãŋãĻãã ãããčĻãįŽã¯ããžãč¯ããĒããããĢãĒã¯ã¨ãšããæŋčĒãããå¯čŊæ§ã¯äŊãã§ãã
ãããĢäģŖããããŽããããžã-ã¯ã¨ãĒããĢããŧãã¯ã¨ãĒãPythonãŽãĒãã¸ã§ã¯ãã¨ããĻ襨ããã¨ãã§ãããããįĸēããĢæŦ įšããããžãã
äžŋåŽä¸ããĒã¯ã¨ãšããŽįææéã¨ãĄãĸãĒãŽä¸Ąæšãæ¯æãåŋ čĻããããžããããããããŠãšããããžãã大čĻæ¨Ąã§č¤éãĒãĸããĒãąãŧãˇã§ãŗãäŊæããå ´åã¯ãæŊ蹥åãåŋ čĻã§ããã¯ã¨ãĒããĢããŧã¯ãããããŽæŊ蹥åãæäžã§ããžããããããŽã¯ã¨ãĒã¯åč§Ŗã§ããžããããããŠãŽãããĢčĄãããããĢã¤ããĻã¯ãå°ãåžã§čĒŦæããžãããããã¯ããã¸ããšãã¸ãã¯ãĢéĸéŖäģããããããŦãŗããĒåã¨ãã§ãĢåŧã°ããĻããéĸæ°ã§ååŠį¨ãæĄåŧĩããžãã¯ãŠãããããã¨ãã§ããžãã
åįã¯ã¨ãĒãŽäŊæã¯é常ãĢį°Ąåã§ããäŊãã夿´ããåŋ čĻãããå ´åã¯ãį§ģčĄãč¨čŋ°ããĻãã ããããŗãŧããŽįĩąč¨åæã§ååã§ããã¨ãĻãäžŋåŠã§ãã
ã¨ãĢããSQLAlchemyã¯ãĒãã§ããīŧãĒãįĢãĄå¯ã䞥å¤ããããŽã§ããīŧ
ããã¯ãį§ģčĄã ãã§ãĒããä¸čŦįãĒåéĄã§ãã Alembicãããå ´åãSQLAlchemyã¯åæããŠã¤ããŧã ãã§æŠčŊããããã§ã¯ãĒãããããšãŋãã¯å ¨äŊãä¸åēĻãĢäŊŋį¨ãããŽãįãĢããĒãŖãĻããžããã¤ãžããDjangoã¯é常ãĢåĒããããŧãĢã§ãããAlchemyã¯ããã¨ãã°asyncpgãaiopgã§äŊŋį¨ã§ããžãã Selivanovãč¨ãŖããããĢãAsyncpgãäŊŋį¨ããã¨ã1į§ããã100ä¸čĄãčĒãŋåããã¨ãã§ããžããããŧãŋããŧãšããčĒãŋåãŖãĻãPythonãĢčģĸéããžããããĄãããSQLAlchemyãäŊŋį¨ããã¨ãå°ãå°ãĒããĒãããĒãŧããŧããããįēįããžããã¨ãĢããã
SQLAlchemyãĢã¯ãæäŊæšæŗãįĨãŖãĻããäŋĄããããĒããģãŠãŽæ°ãŽããŠã¤ããŧããããžãã Oracleã¨PostgreSQLããããããšãĻãŽåĨŊãŋã¨č˛ãĢ寞åŋããĻããžãããããĢããããã¯ãã§ãĢįŽąããåēãããĻãããåĨãŽããŽãåŋ čĻãĒå ´åã¯ãæčŋčĒŋãšãã¨ãããElasticsearchããããžããįĸēããĢãčĒãããã ãã§ãããããããžããīŧ -SQLAlchemyãŽElasticsearchã
é常ãĢåĒãããããĨãĄãŗãã大čĻæ¨ĄãĒãŗããĨãããŖããããžãããããããŽãŠã¤ããŠãĒããããžãããããĻéčĻãĒãã¨ãĢãããã¯ããĒããĢããŦãŧã ã¯ãŧã¯ã¨ãŠã¤ããŠãĒãæį¤ēããžãããããžãčĄãåŋ čĻãŽããįããŋãšã¯ãåŽčĄããĻããå ´åãããã¯ããŧãĢãĢãĒãå¯čŊæ§ããããžãã
ããã§ãããã¯äŊã§æ§æãããĻããžããīŧ
äģæĨä¸įˇãĢåãä¸ģčĻãĒåŽäŊããããĢæãŖãĻããžããããããã¯ããŧããĢã§ãããĒã¯ã¨ãšããäŊæãããĢã¯ãAlchemyãĢãããäŊã§ãããã¨į§ããĄãäŊãæąãŖãĻããããäŧããåŋ čĻããããžããæŦĄã¯MetaDataãŦã¸ãšããĒã§ããã¨ãŗã¸ãŗã¯ãããŧãŋããŧãšãĢæĨįļããDialectãäģããĻããŧãŋããŧãšã¨éäŋĄããããŽã§ãã
ãããäŊã§ããããčŠŗããčĻãĻãŋãžãããã
MetaDataã¯ä¸į¨ŽãŽãĒãã¸ã§ã¯ãã§ããããŗãŗããã§ãããããŧããĢãã¤ãŗããã¯ãšããããŗä¸čŦãĢãææããĻããããšãĻãŽã¨ãŗããŖããŖãčŋŊå ããžããããã¯ã䏿šã§ã¯ãč¨čŋ°ãããŗãŧããĢåēãĨããĻããŧãŋããŧãšããŠãŽãããĢ襨į¤ēããããåæ ãããĒãã¸ã§ã¯ãã§ãã䏿šãMetaDataã¯ããŧãŋããŧãšãĢãĸã¯ãģãšããĻãåŽéãĢåå¨ããããŽãŽãšããããˇã§ãããååžããããŽãĒãã¸ã§ã¯ããĸããĢčĒäŊãæ§į¯ã§ããžãã
ãžããMetaDataãĒãã¸ã§ã¯ããĢã¯é常ãĢčåŗæˇąãæŠčŊã1ã¤ãããžãããããĢãããã¤ãŗããã¯ãšã¨åļį´ãŽãããŠãĢããŽåŊåããŗããŦãŧããåŽįžŠã§ããžãã PostgreSQLãMySQLãMariaDBãĒãŠãããšãĻãŽããŧãŋããŧãšãĢã¯ã¤ãŗããã¯ãšãŽåŧãŗåēãæšæŗãĢéĸããįŦčĒãŽãã¸ã§ãŗããããããį§ģčĄãäŊæããå ´åãããã¯é常ãĢéčĻã§ãã
ä¸é¨ãŽéįēč ã¯ãįŦčĒãŽãã¸ã§ãŗãæãŖãĻããžãããžããSQLAlchemyãäŊŋį¨ããã¨ãæ¨æēãä¸åēĻã ãč¨åŽããĻãããŽåäŊãããšãĻįĸēčĒã§ããžãã SQLiteã¨PostgreSQLãŽä¸Ąæšã§åäŊããåŋ čĻãŽããããã¸ã§ã¯ããéįēããåŋ čĻããããžãããã¨ãĻãäžŋåŠã§ããã
æŦĄãŽãããĢãĒããžããSQLAlchemyããMetaDataãĒãã¸ã§ã¯ããã¤ãŗããŧãããäŊæããã¨ããĢãnaming_conventionããŠãĄãŧãŋãŧãäŊŋį¨ããĻããŗããŦãŧããæåŽããžããããŽããŠãĄãŧãŋãŧãŽããŧã¯ãã¤ãŗããã¯ãšã¨åļį´ãŽãŋã¤ããæåŽããžããix-é常ãŽã¤ãŗããã¯ãšãuq-䏿ãŽã¤ãŗããã¯ãšãfk-å¤é¨ããŧãpk-ããŠã¤ããĒããŧã
Naming_conventionããŠãĄãŧãŋãŧãŽå¤ã§ã¯ãã¤ãŗããã¯ãšãŋã¤ã/åļį´īŧix / uq / fkãĒãŠīŧã¨ããŧããĢåã§æ§æãããããŋãŧãŗãä¸įˇã§åēåãŖãĻæåŽã§ããžããä¸é¨ãŽããŗããŦãŧãã§ã¯ãããšãĻãŽåãä¸čĻ§čĄ¨į¤ēãããã¨ãã§ããžãããã¨ãã°ãããŠã¤ããĒããŧãĢ寞ããĻãããčĄãåŋ čĻã¯ãĒããããŧããĢåãæåŽããã ãã§æ¸ãŋãžãã
æ°ããããã¸ã§ã¯ããŽäŊæãéå§ããã¨ãã¯ãååäģãããŗããŦãŧããä¸åēĻčŋŊå ããã¨åŋããĻããžããžããããäģĨéãããšãĻãŽį§ģčĄã¯åãååãŽã¤ãŗããã¯ãšã¨åļį´ã§įæãããĻããžãã
ããã¯åĨãŽįįąã§éčĻã§ãããĒãã¸ã§ã¯ããĸããĢã§ããŽã¤ãŗããã¯ãšãä¸čĻãĢãĒãŖãã¨å¤æããĻåé¤ããã¨ãAlembicã¯ãããäŊã¨åŧã°ããããčĒčããį§ģčĄãæŖããįæããžããããã¯ãããšãĻãæŖå¸¸ãĢæŠčŊããã¨ããäŋĄé ŧæ§ãŽä¸åŽãŽäŋč¨ŧã§ãã
åŋ ãééãããã1ã¤ãŽé常ãĢéčĻãĒã¨ãŗããŖããŖã¯ãããŧããĢã§ããããã¯ãããŧããĢãĢåĢãžããå 厚ãčĒŦæãããĒãã¸ã§ã¯ãã§ãã
ããŧããĢãĢã¯ååã¨ããŧãŋãŋã¤ããŽåããããMetaDataã¯čĒŦæããããšãĻãŽãŦã¸ãšããĒã§ãããããåŋ įļįãĢMetaDataãŦã¸ãšããĒãåį §ããžãããžããããŧãŋãŋã¤ããŽåããããžãã
į§ããĄãčĒŦæãããã¨ãŽãããã§ãSQLAlchemyã¯äģã§ã¯å¤ããŽãã¨ãįĨããã¨ãã§ããžããããã§å¤é¨ããŧãæåŽããå ´åã§ããåŊŧåĨŗã¯ããŧããĢãäēããĢãŠãŽãããĢæĨįļãããĻããããįĨãŖãĻããžãããããĻãåŊŧåĨŗã¯äŊããããåŋ čĻãããé åēãįĨãŖãĻããã§ãããã
SQLAlchemyãĢã¯EngineããããžããéčĻīŧãĒã¯ã¨ãšããĢã¤ããĻčŋ°ãšããã¨ã¯ååĨãĢäŊŋį¨ã§ããã¨ãŗã¸ãŗã¯ååĨãĢäŊŋį¨ã§ããžãããããĻãããĒãã¯ããšãĻãä¸įˇãĢäŊŋããã¨ãã§ããžããčǰãįĻããžãããã¤ãžããEngineã¯ãĩãŧããŧãĢį´æĨæĨįļããæšæŗãįĨãŖãĻããããžãŖããåãã¤ãŗãŋãŧãã§ã¤ãšãæäžããžããããããããĄãããããžããžãĒããŠã¤ããŧãDBAPIãĢæēæ ãããã¨ããžããæ¨åĨ¨ãčĄããPythonãŽPEPããããžããããããEngineã¯ããšãĻãŽããŧãŋããŧãšãĢ寞ããĻãžãŖããåãã¤ãŗãŋãŧãã§ãŧãšãæäžããé常ãĢäžŋåŠã§ãã
æåžãŽä¸ģčĻãĒãã¤ãĢãšããŧãŗã¯Dialectã§ããããã¯ãã¨ãŗã¸ãŗãããžããžãĒããŧãŋããŧãšã¨éäŋĄããæšæŗã§ãããããĢã¯ãããžããžãĒč¨čĒãããžããžãĒäēēã ãããžããžãĒæšč¨ããããžãã
ãããäŊãŽãããĢãããŽãčĻãĻãŋãžãããã
ããã¯é常ãŽã¤ãŗãĩãŧãããŠãŽãããĢčĻãããã§ãã IDã¨éģåãĄãŧãĢããŖãŧãĢããããŖããåãĢčĒŦæããããŧããĢãĢæ°ããčĄãčŋŊå ããå ´åã¯ãããã§éģåãĄãŧãĢãæåŽããæŋå ĨãåŽčĄããĻãæŋå ĨããããšãĻãŽããŽããããĢčŋããžãã
ãããããŽčĄãčŋŊå ãããå ´åã¯ãŠããĒããžããīŧåéĄãĒãã
ããã§åŖčŋ°ãŽãĒãšããčģĸéããã ãã§ããããã¤ããŽčļ ãˇãŗããĢãĒããŗãŽåŽį§ãĒãŗãŧããŽãããĢčĻããžããããŧãŋãå Ĩããããį¨ŽãŽæ¤č¨ŧã¨JSONãšããŧããĢåæ ŧããããã ãã§ããŧãŋããŧãšãĢå Ĩããžãããčļ į°Ąåã
ä¸é¨ãŽã¯ã¨ãĒã¯é常ãĢč¤éã§ãããĒã¯ã¨ãšããå°åˇããĻ襨į¤ēã§ããå ´åãããã°ããŗãŗãã¤ãĢããåŋ čĻãããå ´åããããžããããã¯éŖãããã¨ã§ã¯ãããžããã AlchemyãäŊŋį¨ããã¨ããããããšãĻãåŽčĄã§ããžããããŽå ´åããĒã¯ã¨ãšãããŗãŗãã¤ãĢããžãããåŽéãĢããŧãŋããŧãšãĢäŊãéäŋĄãããããįĸēčĒã§ããžãã
ããŧãŋčĻæąã¯é常ãĢåį´ãĢčĻããžããæåéã2čĄã§ã1čĄã§æ¸ããã¨ãã§ããžãã
ãã¨ãã°ã15ããŖãŧãĢããŽPATCHãĒã¯ã¨ãšããäŊæããæšæŗãĢã¤ããĻãŽčŗĒåãĢæģããžããããããã§ã¯ãããŖãŧãĢããŽååãããŽããŧããããŗå¤ãŽãŋãæ¸ãčžŧãåŋ čĻããããžããåŋ čĻãĒãŽã¯ããã ãã§ããããĄã¤ãĢãæååãŽäŊæãããžãŖããäŊããããžãããäžŋåŠããã§ããã
ãããããį§ãäģäēã§æ¯æĨäŊŋį¨ããĻããæãéčĻãĒAlchemyæŠčŊã¯ãã¯ã¨ãĒãŽåč§Ŗã¨æĄåŧĩã§ãã
PostgreSQLã§ã¤ãŗãŋãŧãã§ã¤ãšãäŊæããĻããã¨ããã¨ããĸããĒãąãŧãˇã§ãŗã¯äŊãããŽæšæŗã§äēēãæŋčĒããããŽäēēãCRUDãåŽčĄã§ãããããĢããåŋ čĻããããžããããĻãåč§Ŗãããã¨ã¯ããžããããžããã
ããŧãŋãŽããŧã¸ã§ãŗįŽĄįãããžããžãĒæŊ蹥åãäŊŋį¨ããé常ãĢč¤éãĒãĸããĒãąãŧãˇã§ãŗãäŊæããå ´åãįæããã¯ã¨ãĒã¯č¨å¤§ãĒæ°ãŽãĩãã¯ã¨ãĒã§æ§æãããå¯čŊæ§ããããžãããĩãã¯ã¨ãĒã¯ãĩãã¯ã¨ãĒã¨įĩåãããžããããžããžãĒãŋãšã¯ããããžãããžããã¯ã¨ãĒãŽåč§Ŗãé常ãĢåŊšįĢã¤å ´åããããžãããããĢããããã¸ãã¯ã¨ãŗãŧããŽč¨č¨ãå¤§åš ãĢåéĸã§ããžãã
ãĒãããŽãããĢæŠčŊãããŽã§ããīŧãã¨ãã°ãusers_table.selectīŧīŧãĄãŊãããåŧãŗåēãã¨ããĒãã¸ã§ã¯ããčŋãããžããwhereīŧīŧãĒãŠãįĩæãŽãĒãã¸ã§ã¯ããĢ寞ããĻäģãŽãĄãŊãããåŧãŗåēãã¨ãåŽå ¨ãĢæ°ãããĒãã¸ã§ã¯ããčŋãããžããããšãĻãŽã¯ã¨ãĒãĒãã¸ã§ã¯ãã¯ä¸å¤ã§ããããããŖãĻãåĨŊããĒããŽãŽä¸ãĢæ§į¯ãããã¨ãã§ããžãã
alembicãããŽį§ģčĄ
ããã§SQLAlchemyãåĻįããã¤ããĢAlembicãã¤ã°ãŦãŧãˇã§ãŗãäŊæã§ãããããĢãĒããžããã
AlembicãŽäŊŋį¨ãéå§ãããã¨ã¯ãįšãĢåãĢčŋ°ãšããããĢããŧããĢããã§ãĢčĒŦæããMetaDataãĒãã¸ã§ã¯ããæåŽããĻããå ´åã¯ããžãŖããéŖãããããžããã alembicãpipinstallããalembic initalembicã¨åŧãŗãžãã alembic-ãĸã¸ãĨãŧãĢãŽååãããã¯ãŗããŗããŠã¤ãŗã§ããããããããžãã initã¯ãŗããŗãã§ããæåžãŽåŧæ°ã¯ããããé įŊŽããããŠãĢããŧã§ãã
ããŽãŗããŗããåŧãŗåēãã¨ãããã¤ããŽããĄã¤ãĢãäŊæãããžãããããĢã¤ããĻčŠŗããčĻãĻãããžãã
alembic.iniãĢã¯ä¸čŦįãĒæ§æããããžãã script_locationã¯ããžããĢããĒããčĄãããå ´æã§ããæŦĄãĢãįæããį§ģčĄãŽååãŽããŗããŦãŧãã¨ãããŧãŋããŧãšãĢæĨįļãããããŽæ å ąããããžãã
æ°ããį§ģčĄį¨ãŽããŗããŦãŧãããããžãã ãæ°ããį§ģčĄãåŋ čĻã§ããã¨č¨ãã¨ãAlembicã¯įšåŽãŽããŗããŦãŧããĢåžãŖãĻãããäŊæããžãããããããšãĻããĢãšãŋãã¤ãēã§ããžããé常ãĢį°Ąåã§ããããŽããĄã¤ãĢãĢãĸã¯ãģãšããĻãåŋ čĻãĒããŽãᎍéããžããããã§æåŽã§ããããšãĻãŽå¤æ°ã¯ããããĨãĄãŗããĢãããžããããã¯æåãŽé¨åã§ããä¸é¨ãĢããį¨ŽãŽč§ŖčĒŦããããŽã§ãããã§äŊãčĩˇããŖãĻãããŽããčĻããŽãĢäžŋåŠã§ããæŦĄãĢãããšãĻãŽį§ģčĄãĢåĢãžãããšã夿°ãŽãģããããããžã-ãĒãã¸ã§ãŗãdown_revisionãäģæĨã¯åŊŧãã¨ä¸įˇãĢåããžãããããĢ-čŋŊå ãŽãĄãŋæ å ąã
æãéčĻãĒæšæŗã¯ããĸããã°ãŦãŧãã¨ããĻãŗã°ãŦãŧãã§ãã Alembicã¯ãããã§MetaDataãĒãã¸ã§ã¯ãããšããŧããŽčĒŦæã¨ããŧãŋããŧãšãĢããããŽã¨ãŽéãĢčĻã¤ããéããįŊŽãæããžãã
env.pyã¯ãAlembicã§æãčåŗæˇąãããĄã¤ãĢã§ãããŗããŗãåŽčĄãŽé˛čĄįļæŗãåļåžĄããčĒåã§ãĢãšãŋãã¤ãēã§ãããããĢããžãã MetaDataãĒãã¸ã§ã¯ããæĨįļãããŽã¯ããŽããĄã¤ãĢã§ããåãĢčŋ°ãšããããĢãMetaDataãĒãã¸ã§ã¯ãã¯ãããŧãŋããŧãšå ãŽããšãĻãŽã¨ãŗããŖããŖãŽãŦã¸ãšããĒã§ãã
ããã§ããŽMetaDataãĒãã¸ã§ã¯ããæĨįļããĻããžãããããĻããŽæãããAlembicã¯ããããĢį§ãŽãĸããĢããããĢį§ãŽããŦãŧãããããã¨ãįč§ŖããĻããžããåŊŧã¯čĒåãäŊãæąãŖãĻããããįč§ŖããĻããžããæŦĄãĢãAlembicãĢã¯ããĒããŠã¤ãŗãžãã¯ãĒãŗãŠã¤ãŗã§AlembicãåŧãŗåēããŗãŧãããããžãããããĢã¤ããĻãæ¤č¨ããžãã
ããã¯ãžããĢãããã¸ã§ã¯ãã§MetaDataãæĨįļããåŋ čĻãããčĄã§ããäŊããã¯ãŖããããĻããĒããĻãåŋé ããĒãã§ãã ãããį§ã¯ããšãĻãããã¸ã§ã¯ããĢéããĻGitHubãĢæį¨ŋããžãããããĒãã¯ãããč¤čŖŊããĻčĻããã¨ãã§ãããããããšãĻæãããã¨ãã§ããžãã
ãĒãŗãŠã¤ãŗãĸãŧãã¨ã¯äŊã§ããīŧãĒãŗãŠã¤ãŗãĸãŧãã§ã¯ãAlembicã¯alembic.iniããĄã¤ãĢãŽsqlalchemy.urlããŠãĄãŧãŋãŧã§æåŽãããããŧãŋããŧãšãĢæĨįļããį§ģčĄãŽåŽčĄãéå§ããžãã
ãĒãããŽãŗãŧããčĻãĻãããŽã§ããīŧ Alembicã¯é常ãĢæčģãĢãĢãšãŋãã¤ãēã§ããžãã
ããžããžãĒããŧãŋããŧãšãšããŧããĢåå¨ããåŋ čĻããããĸããĒãąãŧãˇã§ãŗãããã¨ããžãããã¨ãã°ãä¸åēĻãĢ夿°ãŽãĸããĒãąãŧãˇã§ãŗã¤ãŗãšãŋãŗãšãåŽčĄãããããããįŦčĒãŽãšããŧã ã§åäŊãããããĢãããã¨ããžããããã¯äžŋåŠã§åŋ čĻãĒå ´åããããžãã
č˛ģį¨ã¯ä¸åããããžããã context.begin_transactionīŧīŧãĄãŊãããåŧãŗåēããåžããŗããŗããSET search_path = SCHEMAããč¨čŋ°ã§ããžãããããĢãããPostgreSQLãĢåĨãŽãããŠãĢããšããŧããäŊŋį¨ãããããĢæį¤ēãããžãããããĻãããããšãĻã§ããäģåžããĸããĒãąãŧãˇã§ãŗã¯åŽå ¨ãĢį°ãĒããšããŧã ã§åäŊããį§ģčĄã¯åĨãŽãšããŧã ãĢį§ģčĄããžããããã¯1čĄãŽčŗĒåã§ãã
ãĒããŠã¤ãŗãĸãŧãããããžããããã§ã¯ãAlembicã¯ã¨ãŗã¸ãŗãäŊŋį¨ããĒããã¨ãĢæŗ¨æããĻãã ãããããã§åŊŧãĢãĒãŗã¯ãæ¸Ąãã ãã§ããããĄãããã¨ãŗã¸ãŗãčģĸéãããã¨ãã§ããžããããŠããĢãæĨįļãããžãããįãŽã¯ã¨ãĒãįæããã ãã§ããŠããã§åŽčĄã§ããžãã
ã¤ãžããAlembicã¨ããã¤ããŽMetaDataã¨ããŧããĢããããžãããããĻãæįĩįãĢčĒåã§į§ģčĄãįæãããã¨ããžããããŽãŗããŗããåŽčĄããã¨ãåēæŦįãĢã¯ããã ãã§ãã Alembicã¯ããŧãŋããŧãšãĢãĸã¯ãģãšãããããĢäŊãããããįĸēčĒããžããåŊŧãŽįšåĨãĒãŠããĢãalembic_versionsãã¯ãããžããīŧããã¯ãį§ģčĄãããŽããŧãŋããŧãšã§ãã§ãĢåąéãããĻãããã¨ãį¤ēããĻããžããīŧãããĢãŠãŽããŧããĢãåå¨ããããããããžããããŧãŋããŧãšãĢåŋ čĻãĒããŧãŋã襨į¤ēãããžãããããããšãĻãåæããããŽããŗããŦãŧããĢåēãĨããĻæ°ããããĄã¤ãĢãįæããã¨ãį§ģčĄãčĄãããžããããĄãããAlembicã¯åŋ ãããåŋ čĻãĒããŽãįæããã¨ã¯éããĒããããį§ģčĄã§įæãããããŽãåŋ ãįĸēčĒããåŋ čĻããããžãããããããģã¨ããŠãŽå ´åãããã¯æŠčŊããžãã
äŊãįæããžãããīŧãĻãŧãļãŧãŽãĩã¤ãŗããããžãããį§ģčĄãįæããã¨ããĢãæåãŽãĄããģãŧã¸ãį¤ēããžãããį§ģčĄãĢã¯ãäģĨåãĢalembic.iniã§æåŽãããäģãŽããŗããŦãŧããäŊŋį¨ããĻinitial.pyã¨ããååãäģããããžãã
ããŽį§ģčĄãŽIDãĢéĸããæ å ąããããžãã down_revision = None-ããã¯æåãŽį§ģčĄã§ãã
æŦĄãŽãšãŠã¤ãã¯æãéčĻãĒé¨åã§ãīŧãĸããã°ãŦãŧãã¨ããĻãŗã°ãŦãŧãã
ãĸããã°ãŦãŧãã§ã¯ãããŦãŧããäŊæãããĻãããã¨ãããããžããããĻãŗã°ãŦãŧãã§ã¯ãããŽč¨åˇã¯åé¤ãããžãã Alembicã¯ããããŠãĢãã§ãããŽãããĒãŗãĄãŗããå ˇäŊįãĢčŋŊå ããĻããããĢį§ģåããĻᎍéããå°ãĒãã¨ãããããŽãŗãĄãŗããåé¤ããžããåŋĩãŽãããį§ģčĄãįĸēčĒããããšãĻããåŽĸæ§ãĢéŠããĻãããã¨ãįĸēčĒããžãããããã¯1ã¤ãŽããŧã ãŽåéĄã§ãããã§ãĢį§ģčĄããããžãã
ããŽåžãããŽį§ģčĄãéŠį¨ããå¯čŊæ§ããããžããį°ĄåãĒãã¨ã§ã¯ãããžãããããĒãã¯ãã č¨ãåŋ čĻããããžãīŧãĸãŦã ããã¯ãĸããã°ãŦãŧãããããåŊŧã¯įĩļ寞ãĢããšãĻãéŠį¨ããžãã
é ã¨č¨ãã¨ãææ°ãŽį§ģčĄãĢæ´æ°ãããã¨ããžããįšåŽãŽį§ģčĄãĢååãäģããã¨ããããĢæ´æ°ãããžãã
ãã¨ãã°ãæ°ãå¤ããŖãå ´åãĢåããĻãããĻãŗã°ãŦãŧããŗããŗãããããžããããã¯ããšãĻããŠãŗãļã¯ãˇã§ãŗã§čĄãããé常ãĢį°ĄåãĢæŠčŊããžãã
ã¤ãžããį§ģčĄããããããããåŽčĄããæšæŗãįĨãŖãĻããžãããĸããĒãąãŧãˇã§ãŗãããããã¨ãã°ãæŦĄãŽčŗĒåãããĻããå ´åīŧCIããããããšããåŽčĄãããĻããžãããã¨ãã°ãį§ģčĄãčĒåįãĢåŽčĄããããŠããããããããžãããããļãããĒããŽæã§ãããããæšãč¯ãã§ããīŧ
ãããĢã¯ããžããžãĒčĻįšããããžããããããããĢãŧãĢãåŽã䞥å¤ããããžããį°ĄåãĢãĸã¯ãģãšã§ãããããŧãŋããŧãšãåããčģãĢäšããã¨ãã§ããĒãå ´åã¯ãããĄãããčĒåįãĢčĄãæšãããã§ãããã
ãĸã¯ãģãšã§ããå ´åã¯ãã¯ãŠãĻãã§æŠčŊãããĩãŧããšãäŊæãããã¤ãæãŖãĻãããŠããããããããããĢãĸã¯ãģãšã§ããžããããããã°ãčĒåã§ãããåŽčĄã§ãããããããčŠŗį´°ãĢåļåžĄã§ããžãã
ä¸čŦãĢããããčĒåįãĢčĄããããŽããŧãĢã¯ãããããããžãããã¨ãã°ãåãKubernetesã§ããããåŽčĄã§ããããããŽãŗããŗããåŽčĄã§ããinitãŗãŗãããŧããããžãããããčĄããĢã¯ãčĩˇåãŗããŗããDockerãĢį´æĨčŋŊå ã§ããžãã
čæ Žããåŋ čĻããããŽã¯ãį§ģčĄãčĒåįãĢéŠį¨ããå ´åããã¨ãã°ãããŧãĢããã¯ããããã§ããĒãå ´åãĢãŠããĒãããčããåŋ čĻãããã¨ãããã¨ã§ãããã¨ãã°ã500ãŽãŦãã¤ããŽããŧãŋããŦãŧãããããžãããããĒãã¯čããžããīŧããĻãããŽããŧãŋã¯ãã¯ããã¸ããšãã¸ãã¯ãĢã¯åŋ čĻãããžããããããããããčŊã¨ããã¨ãã§ããžããåŊŧãã¯ãããåãããããčŊã¨ããžããããžãã¯ãããŧãŋãŽæå¤ąãĢäŧ´ãŖãĻ夿´ãããåãŽãŋã¤ãã夿´ããžããããã¨ãã°ãéˇãåããããžããããįããĒããžããããžãã¯äŊãããĒããĒãŖãĻããžãããžãã¯ãåãåé¤ããžãããåŋ čĻãĒå ´åã§ãããŧãĢããã¯ãããã¨ã¯ã§ããžããã
ãã¤ãĻį§ã¯ãĒãŗããŦããšåããŽčŖŊåãäŊæããžãããããã¯ãããˇãŗä¸ã§į´æĨäēēã ãŽãããĢexeããĄã¤ãĢãĢããŖãĻã¤ãŗãšããŧãĢãããžããįč§Ŗãããīŧã¯ããããĒãã¯į§ģčĄãæ¸ããžãããããã¯æŦįĒį°åĸãĢå Ĩããžãããäēēã ã¯ãã§ãĢãããã¤ãŗãšããŧãĢããžãããäģåž5åš´éã§ãSLAãĢåžãŖãĻæŠčŊããå¯čŊæ§ããããäŊãã夿´ãããå ´åã¯ãäŊããæšåãããå¯čŊæ§ããããžããããŽæįšã§ãä¸å¯éįãĒ夿´ãĢ寞åĻããæšæŗãĢã¤ããĻčããžãã
ãããĢãããąããį§åĻã¯ãããžããããĸã¤ããĸã¯ãããããŽåãŽäŊŋį¨ãããŧããĢãŽäŊŋį¨ãã§ããã ãéŋãããã¨ãã§ããã¨ãããã¨ã§ããããããĢéŖįĩĄãããŽããããĒããããã¨ãã°ãORMã§įšåĨãĒããŗãŦãŧãŋãäŊŋį¨ããĻããŖãŧãĢããĢããŧã¯ãäģãããã¨ãã§ããžããåŊŧã¯ãã°ã§ããĒããããŽããŖãŧãĢããĢč§ĻããããĒãããã ãŖãã¨č¨ãã§ãããããããããĒãã¯ãžã åŊŧãĢč¨åããĻããžããããã¯ãã°ãĢãŋãšã¯ãäŊæãããã¤ãåé¤ããã ãã§ãã
ãŠãĄããã¨ããã°ãããŧãĢããã¯ããæéããããžãããããĻãããšãĻãããžãããã°ãããã¯ãã°ãŽåžåã§ããŽãŋãšã¯ãčŊãĄįããĻåŽčĄããžããåŽéãĢããšãĻãåé¤ããåĨãŽį§ģčĄãčĄããžãã
ããã§æãéčĻãĒčŗĒåã§ããį§ģčĄãããšãããįįąã¨æšæŗã¯īŧ
į§ãå°ããäēēãŽãģã¨ããŠã¯ãããããžããããããããããčĄãæšãč¯ãã§ããããã¯ãįãŋãčĄãæąã§æ¸ããããĢãŧãĢã§ããæŦįĒį°åĸã§į§ģčĄãäŊŋį¨ãããã¨ã¯å¸¸ãĢåąéēã§ããããĒãã¯ããããŠãŽãããĢįĩããããæąēããĻįĨããžããã CIãæ§æããĻããå ´åãåŽå ¨ãĢæŖå¸¸ãĢåäŊããæŦįĒį°åĸã§ãŽé常ãĢåĒããį§ģčĄã§ãããã¸ãŖãŧã¯ããå¯čŊæ§ããããžãã
åŽéãŽã¨ãããį§ģčĄãããšãããã¨ããĢããã¨ãã°ããšããŧã¸ãžãã¯æŦįĒį°åĸãŽä¸é¨ãããĻãŗããŧããããã¨ãã§ããžãããããã¯ãˇã§ãŗã¯å¤§čĻæ¨ĄãĢãĒãå¯čŊæ§ããããããšããããŽäģãŽãŋãšã¯ãŽãããĢåŽå ¨ãĢããĻãŗããŧããããã¨ã¯ã§ããžãããéįēæ įšã¯ãååã¨ããĻãåŽéãĢã¯įįŖæ įšã§ã¯ãããžãããåŊŧãã¯äŊåš´ãĢããããŖãĻčįŠã§ããããŽãŽå¤ããæãŖãĻããžããã
ããã¯ãäŊããį§ģčĄããã¨ããĢããŧãŋãį ´æããããããŧãŋãŽä¸č˛Ģæ§ãå¤ąãããå¤ããŊãããĻã§ãĸã§ããå¯čŊæ§ããããžããčǰããå¤é¨ããŧãčŋŊå ãããŽãåŋããå ´åãããã¯æéģãŽäžåéĸäŋã§ããå¯čŊæ§ããããžããåŊŧã¯ãããã¤ãĒããŖãĻããã¨æããžãããäžãã°åŊŧãŽååã¯ãããĢã¤ããĻįĨããžãããããŖãŧãĢããåļįļãĢåŧã°ããæĨįļãããĻããããŠããã¯ãžãŖããããããžããã
ããããčǰããå ĨãŖãĻãããį¨ŽãŽã¤ãŗããã¯ãšãį´æĨæŦįĒį°åĸãĢčŋŊå ãããã¨ãĢããžããããäģã¯é ããĒããžãããéãåäŊãå§ããããŠããĒãã§ããããīŧãčĒåŧĩããĻãããããããžããããåŽéãĢã¯ããŧãŋããŧãšå ã§äŊãã夿´ãããã¨ããããžãã
ããĄããããšããŧããŽį§ģčĄã§ã¯ãããŧãĢãĢã¨ãŠãŧããããžããæŖį´ãĒã¨ãããį§ã¯ãããĢééããĻããžãããé常ãæåãŽ3ã¤ãŽåéĄããããžããããããĻãããããããŧãŋããŠãŽãããĢčģĸéããããšãããĢã¤ããĻãŽäģŽåŽãĢãããããå¤ããŽã¨ãŠãŧã
é常ãĢ大ããĒãĒãã¸ã§ã¯ããĸããĢãããå ´åãããšãĻãåŋĩé ãĢįŊŽããã¨ã¯å°éŖã§ãã常ãĢææ°ãŽãããĨãĄãŗããäŊæãããã¨ã¯å°éŖã§ããææ°ãŽãããĨãĄãŗãã¯ãŗãŧãã§ããããã¸ããšãã¸ãã¯ãåŽå ¨ãĢč¨čŋ°ãããĻããã¨ã¯éããžãããã¤ãžããäŊããŠãŽãããĢæŠčŊãããããčǰãäŊãåŋĩé ãĢįŊŽããĻãããã§ãã
äŊãįĸēčĒã§ããžããīŧå°ãĒãã¨ãį§ģčĄãå§ãžãã¨ããäēåŽãããã¯ãã§ãĢį´ æ´ãããã§ãããããĻããŗãŧããĢæããĒãŋã¤ãããšããĒããã¨ãæåšãĒdowngradeīŧīŧãĄãŊããããããã¨ãdowngradeīŧīŧãĄãŊãããSQLAlchemyãĢããŖãĻäŊæãããããšãĻãŽããŧãŋãŋã¤ããåé¤ãããã¨ãįĸēčĒã§ããžãã
SQLAlchemyã¯å¤ããŽį´ æ´ããããã¨ãããžãããã¨ãã°ãããŧããĢãč¨čŋ°ããĻEnumåãŋã¤ããæåŽããã¨ãSQLAlchemyã¯PostgreSQLã§ããŽåæåãŽããŧãŋãŋã¤ããčĒåįãĢäŊæããžãããã ããdowngradeīŧīŧãĄãŊããã§ããŽããŧãŋãŋã¤ããåé¤ãããŗãŧãã¯čĒåįãĢįæãããžããã
ãããčĻããĻįĸēčĒããåŋ čĻããããžããį§ģčĄãããŧãĢããã¯ããĻåéŠį¨ããå ´åãupgradeīŧīŧãĄãŊããã§æĸåãŽããŧãŋãŋã¤ããäŊæãããã¨ããã¨ãäžå¤ããšããŧãããžãããããĻæãéčĻãĒãã¨ã¯ãį§ģčĄãĢããŖãĻããŧãŋã夿´ãããå ´åããĸããã°ãŦãŧãæãĢããŧãŋãæŖãã夿´ããããã¨ãįĸēčĒããåŋ čĻããããžãããžããããĻãŗã°ãŦãŧãæãĢå¯äŊį¨ãĒããĢæŖããããŧãĢããã¯ãããã¨ãįĸēčĒãããã¨ãé常ãĢéčĻã§ãã
ããšãčĒäŊãĢé˛ãåãĢãããšããäŊæãããããŽæåãŽæēåæšæŗãčĻãĻãŋãžããããį§ã¯ãããĢ寞ããå¤ããŽãĸãããŧããčĻãĻããžãããä¸é¨ãŽäēēã ã¯ãããŧãšãããŦãŧããäŊæãããããããšãĻã¯ãĒãŧãŗãĸããããããŖã¯ãšããŖãäŊæããããį¨ŽãŽčĒåéŠį¨ããŖã¯ãšããŖãäŊŋį¨ããžãããããã100īŧ äŋčˇããåŽå ¨ãĢééĸããããšããŧãšã§ããšããåŽčĄããįæŗįãĒæšæŗã¯ãåĨãŽããŧãŋããŧãšãäŊæãããã¨ã§ãã
ããŧãŋããŧãšãäŊæãããŗåé¤ã§ããį´ æ´ãããsqlalchemy_utilsãĸã¸ãĨãŧãĢããããžãã PostgreSQLã§ã¯ãåŊŧã¯æŦĄãŽãã¨ãįĸēčĒããžããã¯ãŠã¤ãĸãŗããŽ1ã¤ããšãĒãŧãįļæ ãĢãĒããåæããĒããŖãå ´åããčǰããããŧãŋããŧãšãäŊŋį¨ããĻããžããããŧãŋããŧãšãäŊŋį¨ããĻäŊãã§ããžãããåé¤ã§ããžãããã¨ããã¨ãŠãŧã§ã¯ãŠããˇãĨãããã¨ã¯ãããžãããäģŖãããĢãåŊŧã¯čǰãããããĢæĨįļããããåˇéãĢįĸēčĒããããããŽã¯ãŠã¤ãĸãŗããåæããåˇéãĢããŧãšãåé¤ããžãã
ããŧãŋããŧãšãæ§į¯ããåããšããĢį§ģčĄãéŠį¨ãããã¨ã¯ãåŋ ãããčŋ éãĒãããģãšã§ã¯ãããžãããããã¯æŦĄãŽãããĢč§Ŗæąēã§ããžããPostgreSQLã¯ããŗããŦãŧããããŽæ°ããããŧãŋããŧãšãŽäŊæããĩããŧãããĻãããããããŧãŋããŧãšãŽæēåã2ã¤ãŽããŖã¯ãšããŖãĢåå˛ã§ããžãã
æåãŽããŖã¯ãšããŖã¯1ååŽčĄãããããšãĻãŽããšãīŧscope = sessionīŧãåŽčĄãããããŧãŋããŧãšãäŊæããããããĢį§ģčĄãéŠį¨ãããžãã 2įĒįŽãŽããŖã¯ãšããŖīŧscope = functionīŧã¯ãæåãŽããŖã¯ãšããŖãŽããŧãšãĢåēãĨããĻãåããšããŽããŧãšãį´æĨäŊæããžãã
ããŗããŦãŧãããããŧãŋããŧãšãäŊæãããŽã¯é常ãĢéĢéã§ãåããšããĢį§ģčĄãéŠį¨ããæéãį¯į´ã§ããžãã
䏿įãĢããŧãŋããŧãšãäŊæããæšæŗãĢã¤ããĻ芹ããĻããã ããĒããããŽãããĒããŖã¯ãšããŖãæ¸ããã¨ãã§ããžããäŊãčĩˇããĻãīŧãŠãŗãã ãĒååãįæããžããåŋĩãŽãããpytestãŽæåžãĢčŋŊå ããžãããããĢãããPosticoãäģããĻlocalhostãĢį§ģåããã¨ããĢãããšããĢããŖãĻäŊæãããããŽã¨äŊæãããĒããŖãããŽãįč§Ŗã§ããžãã
æŦĄãĢãããŽäēēãį¤ēããããŧãŋããŧãšã¸ãŽæĨįļãĢéĸããæ å ąãåĢããĒãŗã¯ãããæ°ããããŧãŋããŧãšãæã¤æ°ãããĒãŗã¯ãįæããžããäŊæããĻããšããĢéäŋĄããžããäēēãããŽããŧãŋããŧãšãæäŊããåžããããåé¤ããžãã
ããŽããŧãŋããŧãšãĢæĨįļãããããĢã¨ãŗã¸ãŗãæēåãããã¨ãã§ããžããã¤ãžããããŽããŖã¯ãšããŖã§ã¯ãäžåéĸäŋã¨ããĻäŊŋį¨ãããĻããäģĨåãŽããŖã¯ãšããŖãåį §ããžããã¨ãŗã¸ãŗãäŊæããĻããšããĢéäŋĄããžãã
ã§ã¯ããŠãŽãããĒããšããæ¸ããã¨ãã§ããžããīŧæåãŽããšãã¯ãį§ãŽååãŽį´ æ´ãããįēæã§ããįģå ´ããĻãããį§ģčĄãŽåéĄãåŋããĻããžãŖãããã§ãã
ããã¯é常ãĢį°ĄåãĒããšãã§ããããã¸ã§ã¯ããĢä¸åēĻčŋŊå ããžããããã¯GitHubãŽããã¸ã§ã¯ããĢãããžã..ãããĒãã¯ãããããĒããĢããŠãã°ããĻãããããåéĄãŽį´80ããŧãģãŗããčŋŊå ããĻåŋãããã¨ãã§ããžãã
ããã¯é常ãĢåį´ãĒãã¨ãããžãīŧããã¯ããšãĻãŽį§ģčĄãŽãĒãšããååžããããããĢ寞ããĻå垊ãéå§ããžãããĸããã°ãŦãŧããããĻãŗã°ãŦãŧãããĸããã°ãŦãŧããåŧãŗåēããžãã
ãã¨ãã°ã5ã¤ãŽį§ģčĄããããžããããããŠãŽãããĢæŠčŊãããčĻãĻãŋãžãããããããæåãŽį§ģčĄã§ããį§ããĄã¯ãããåŽįžããžãããæåãŽį§ģčĄãããŧãĢããã¯ããååēĻåŽčĄããžããããã§äŊãčĩˇããŖããŽã§ããīŧåŽéãããã§ã¯ããã¨ãã°2åã¯ããŧããĢãäŊæã§ããĒããŖããããããĻãŗã°ãŦãŧãīŧīŧãĄãŊãããæŖããåŽčŖ ããĻãããã¨ãããããžããã
ããäēēãããã¤ããŽããŧãŋãŋã¤ããäŊæããå ´åããŋã¤ãããšããĒããä¸čŦįãĢã¯å°ãĒãã¨ãäŊãããŽåŊĸã§æŠčŊãããããããããåé¤ãããã¨ãããããžãã
ããŽåžãããšããé˛ãŋãžããåŊŧã¯2åįŽãŽį§ģčĄãčĄãããããĢåŽčĄãã1ãšãããããŧãĢããã¯ããåãŗåé˛ããžãããããĻãããã¯į§ģčĄãŽåæ°ã ãįēįããžãã
ããŽããšããŽįŽįã¯ãããŧãŋæ§é ã夿´ããéãŽåēæŦįãĒã¨ãŠãŧãåéĄãčĻã¤ãããã¨ã§ãã
éæŽĩã¯įŠēãŽããŧãšããå§ãžããé常ã¯é常ãĢéĢéã§ããã¤ãžããããŽããšãã¯ããŧãŋæ§é ãĢéĸããããŽã§ããããã¯ãį§ģčĄæãĢããŧãŋã夿´ãããã¨ã§ã¯ãããžãããããããå ¨äŊã¨ããĻãããã¯ããĒããŽåŊãé常ãĢããæããã¨ãã§ããžãã
čŋ éãĒäŋŽæŖãåŋ čĻãĒå ´åã¯ããããããã§ããããŽãĢãŧãĢã¯ã§ããååã¨ããĻãããã¸ã§ã¯ããĢæŋå Ĩããã¨ãį°ĄåãĢãĒããžãã
ããŽããšãã¯æŦĄãŽãããĢãĒããžããããšãĻãŽãĒãã¸ã§ãŗãååžããAlembicæ§æãįæããžãããããåãĢčĻãããŽãalembic.iniããĄã¤ãĢã§ãããããget_alembic_configéĸæ°ã§ããããŧãšã¸ãŽããšãæåŽãããããããŽããĄã¤ãĢãčĒãŋåãã䏿ããŧãšãčŋŊå ããžããããŽåžãAlembicãŗããŗããäŊŋį¨ã§ããžãã
äģĨåãĢåŽčĄããããŗããŗãīŧalembic upgrade headīŧãåŽå ¨ãĢã¤ãŗããŧãã§ããžããæŽåŋĩãĒãããããŽãšãŠã¤ãã¯ããšãĻãŽã¤ãŗããŧããĢéŠåããããã§ã¯ãããžããããį§ãŽč¨čãäŋĄããĻãã ãããããã¯ãalembic.comãŽã¤ãŗããŧããĸããã°ãŦãŧããããŽããŽã§ããããã§č¨åŽãįŋģ荺ãããŠãã§ãĸããã°ãŦãŧããčĄãããæį¤ēããžããæŦĄãĢããããĻãŗã°ãŦãŧããã¨č¨ããžãã
ããĻãŗã°ãŦãŧãã§ã¯ãį§ģčĄã¯down_revisionãã¤ãžãåãŽãĒãã¸ã§ãŗããžãã¯ã-1ããĢããŧãĢããã¯ãããžãã
ã-1ãã¯ãįžå¨ãŽį§ģčĄãããŧãĢããã¯ãããããĢAlembicãĢæį¤ēããåĨãŽæšæŗã§ããæåãŽį§ģčĄãéå§ãããã¨ããĢé常ãĢéĸéŖæ§ããããããŽdown_revisionã¯Noneã§ãããAlembicAPIã§ã¯downgradeãŗããŗããĢNoneãæ¸Ąããã¨ã¯ã§ããžããã
ããŽåžãupgradeãŗããŗããååēĻåŽčĄãããžãã
æŦĄãĢãããŧãŋãäŊŋį¨ããĻį§ģčĄãããšãããæšæŗãĢã¤ããĻčĒŦæããžãã
ããŧãŋãŽį§ģčĄã¯ãé常ã¯é常ãĢåį´ãĢčĻãããããĒããŽã§ãããæãįãããŽã§ããããããŧããĢããããŧãŋã鏿ãæŋå ĨãååžãããããããããĢį°ãĒãåŊĸåŧã§åĨãŽããŧããĢãĢčģĸéãããããĢčĻããã§ããã-ããŖã¨į°ĄåãĒãã¨ã¯äŊã§ããããīŧ
ããŽããšããĢã¤ããĻã¯ãåãŽããšãã¨ã¯į°ãĒããéįēãĢé常ãĢč˛ģį¨ããããã¨č¨ãããĻããžãã大čĻæ¨ĄãĒį§ģčĄãčĄãŖãã¨ããããšãĻãŽä¸å¤æĄäģļãįĸēčĒãããŽãĢ6æéããããã¨ããããžããããããšãĻãčĒŦæããĻãåéĄãããžãããããããį§ããã§ãĢããããŽį§ģčĄãčĄãŖãĻããã¨ããį§ã¯čŊãĄįããĻããžããã
ããŽããšãã¯ãŠãŽãããĢæŠčŊããžããīŧãĸã¤ããĸã¯ãįžå¨ããšããããããŽãžã§ãŽããšãĻãŽį§ģčĄãéŠį¨ãããã¨ã§ãã夿´ãããããŧãŋãŽãģãããããŧãŋããŧãšãĢæŋå ĨããžããæéģįãĢ夿´ãããå¯čŊæ§ãŽããčŋŊå ãŽããŧãŋãæŋå Ĩãããã¨ãčãããã¨ãã§ããžããæŦĄãĢããĸããã°ãŦãŧãããžããããŧãŋãæŖãã夿´ããããã¨ãįĸēčĒããããĻãŗã°ãŦãŧããåŽčĄããĻãããŧãŋãæŖãã夿´ããããã¨ãįĸēčĒããžãã
ãŗãŧãã¯æŦĄãŽãããĢãĒããžããã¤ãžãããĒãã¸ã§ãŗãĢããããŠãĄãŧãŋåããããããŠãĄãŧãŋãŽãģããããããžããããã§ã¨ãŗã¸ãŗãåãå Ĩããããšããéå§ããį§ģčĄãåãå Ĩããžãã
æŦĄãĢãããšããããrev_headã§ãããããĻã3ã¤ãŽãŗãŧãĢããã¯ããããã¯ããŠããã§åŽįžŠãããŗãŧãĢããã¯ã§ãããäŊããčĄãããåžãĢåŧãŗåēãããžããããã§äŊãčĩˇããŖãĻãããŽããįĸēčĒã§ããžãã
äžã¯ãŠããĢãããžããīŧ
į§ã¯ãããããšãĻGitHubãŽäžãĢ芰ãčžŧãŋãžããããããĢã¯åŽéãĢã¯å¤ããŽãŗãŧãã¯ãããžãããããšãŠã¤ããĢčŋŊå ãããŽã¯é常ãĢå°éŖã§ããį§ã¯æãåēæŦįãĒãã¨ãĢčãããã¨ããžããã GitHubãĢãĸã¯ãģãšããĻãããã¸ã§ã¯ãčĒäŊã§ãŠãŽãããĢæŠčŊããããįĸēčĒã§ããžãããããæãį°ĄåãĒæšæŗã§ãã
äģãĢæŗ¨æãæã䞥å¤ãããããŽã¯äŊã§ããīŧčĩˇåæãĢãAlembicã¯čĩˇåãããããŠãĢããŧã§alembic.iniæ§æããĄã¤ãĢãæĸããžããããĄãããį°åĸ夿°ALEMBIC_CONFIGãäŊŋį¨ããĻããšãæåŽã§ããžãããããã¯åŋ ãããäžŋåŠã§ããããããã¨ã¯éããžããã
åĨãŽåéĄīŧããŧãŋããŧãšãĢæĨįļãããããŽæ å ąã¯alembic.iniã§æåŽãããĻããžãããå¤ããŽå ´åã褿°ãŽããŧãŋããŧãšãé įĒãĢæäŊããæŠčŊãåŋ čĻã§ãããã¨ãã°ãį§ģčĄããšããŧã¸ãĢåąéããĻãããæŦįĒį°åĸãĢåąéããžããä¸čŦãĢãSQLALCHEMY_URLį°åĸ夿°ã§æĨįļæ å ąãæåŽã§ããžãããããã¯ãŊãããĻã§ãĸãŽã¨ãŗããĻãŧãļãŧãĢã¯ããžãæįŊã§ã¯ãããžããã
ãžããã¨ãŗããĻãŧãļãŧããalembicããããã$ project $ -dbããĻãŧããŖãĒããŖãäŊŋį¨ããæšãã¯ãããĢį´æįã§ãã
ããã¸ã§ã¯ããŽäžãčĻãã¨ãã¯ãstaff-dbãĻãŧããŖãĒããŖãčĻãĻãã ãããããã¯AlembicãŽčããŠãããŧã§ãããAlembicããĢãšãŋãã¤ãēãããã1ã¤ãŽæšæŗã§ãããããŠãĢãã§ã¯ãããã¸ã§ã¯ãå ãŽalembic.iniããĄã¤ãĢãããŽå ´æãĢéĸéŖããĻæ¤į´ĸããžãããĻãŧãļãŧãåŊŧåĨŗã¨åŧãã§ããããŠãĢããŧãããåŊŧåĨŗčĒčēĢãæ§æããĄã¤ãĢãčĻã¤ããžãããžããstaff-dbã¯åŧæ°--db-urlãčŋŊå ããžãããããäŊŋį¨ããĻãããŧãŋããŧãšãĢæĨįļãããããŽæ å ąãæåŽã§ããžãããããĻãéčĻãĒãã¨ãĢãä¸čŦįãĢåãå ĨããããĻãã--helpãĒããˇã§ãŗãæ¸ĄããĻãããįĸēčĒããĻãã ãããįĩåąãŽã¨ããããĻãŧããŖãĒããŖãŽååã¯į´æįã§ãã
ããšãĻãŽåŽčĄå¯čŊãĒããã¸ã§ã¯ããŗããŗãã¯ããstaffããĸã¸ãĨãŧãĢãŽååã§å§ãžããžããRESTAPIãåŽčĄããstaff-apiã¨ãåēæŦįļæ ãįŽĄįããstaff-dbã§ããããŽããŋãŧãŗãįč§Ŗããã¨ãã¯ãŠã¤ãĸãŗãã¯ããã°ãŠã ãŽååãæ¸ãčžŧãŋãããĢããŧã ãåŋããå ´åã§ããTABããŧãæŧããã¨ã§åŠį¨å¯čŊãĒããšãĻãŽãĻãŧããŖãĒããŖã襨į¤ēã§ãããããĢãĒããžããį§ã¯ããšãĻãæãŖãĻããžãããããã¨ãã