PNG  IHDRQgAMA a cHRMz&u0`:pQ<bKGDgmIDATxwUﹻ& ^CX(J I@ "% (** BX +*i"]j(IH{~R)[~>h{}gy)I$Ij .I$I$ʊy@}x.: $I$Ii}VZPC)I$IF ^0ʐJ$I$Q^}{"r=OzI$gRZeC.IOvH eKX $IMpxsk.쒷/&r[޳<v| .I~)@$updYRa$I |M.e JaֶpSYR6j>h%IRز if&uJ)M$I vLi=H;7UJ,],X$I1AҒJ$ XY XzI@GNҥRT)E@;]K*Mw;#5_wOn~\ DC&$(A5 RRFkvIR}l!RytRl;~^ǷJj اy뷦BZJr&ӥ8Pjw~vnv X^(I;4R=P[3]J,]ȏ~:3?[ a&e)`e*P[4]T=Cq6R[ ~ޤrXR Հg(t_HZ-Hg M$ãmL5R uk*`%C-E6/%[t X.{8P9Z.vkXŐKjgKZHg(aK9ڦmKjѺm_ \#$5,)-  61eJ,5m| r'= &ڡd%-]J on Xm|{ RҞe $eڧY XYrԮ-a7RK6h>n$5AVڴi*ֆK)mѦtmr1p| q:흺,)Oi*ֺK)ܬ֦K-5r3>0ԔHjJئEZj,%re~/z%jVMڸmrt)3]J,T K֦OvԒgii*bKiNO~%PW0=dii2tJ9Jݕ{7"I P9JKTbu,%r"6RKU}Ij2HKZXJ,妝 XYrP ެ24c%i^IK|.H,%rb:XRl1X4Pe/`x&P8Pj28Mzsx2r\zRPz4J}yP[g=L) .Q[6RjWgp FIH*-`IMRaK9TXcq*I y[jE>cw%gLRԕiFCj-ďa`#e~I j,%r,)?[gp FI˨mnWX#>mʔ XA DZf9,nKҲzIZXJ,L#kiPz4JZF,I,`61%2s $,VOϚ2/UFJfy7K> X+6 STXIeJILzMfKm LRaK9%|4p9LwJI!`NsiazĔ)%- XMq>pk$-$Q2x#N ؎-QR}ᶦHZډ)J,l#i@yn3LN`;nڔ XuX5pF)m|^0(>BHF9(cզEerJI rg7 4I@z0\JIi䵙RR0s;$s6eJ,`n 䂦0a)S)A 1eJ,堌#635RIgpNHuTH_SԕqVe ` &S)>p;S$魁eKIuX`I4춒o}`m$1":PI<[v9^\pTJjriRŭ P{#{R2,`)e-`mgj~1ϣLKam7&U\j/3mJ,`F;M'䱀 .KR#)yhTq;pcK9(q!w?uRR,n.yw*UXj#\]ɱ(qv2=RqfB#iJmmL<]Y͙#$5 uTU7ӦXR+q,`I}qL'`6Kͷ6r,]0S$- [RKR3oiRE|nӦXR.(i:LDLTJjY%o:)6rxzҒqTJjh㞦I.$YR.ʼnGZ\ֿf:%55 I˼!6dKxm4E"mG_ s? .e*?LRfK9%q#uh$)i3ULRfK9yxm܌bj84$i1U^@Wbm4uJ,ҪA>_Ij?1v32[gLRD96oTaR׿N7%L2 NT,`)7&ƝL*꽙yp_$M2#AS,`)7$rkTA29_Iye"|/0t)$n XT2`YJ;6Jx".e<`$) PI$5V4]29SRI>~=@j]lp2`K9Jaai^" Ԋ29ORI%:XV5]JmN9]H;1UC39NI%Xe78t)a;Oi Ҙ>Xt"~G>_mn:%|~ޅ_+]$o)@ǀ{hgN;IK6G&rp)T2i୦KJuv*T=TOSV>(~D>dm,I*Ɛ:R#ۙNI%D>G.n$o;+#RR!.eU˽TRI28t)1LWϚ>IJa3oFbu&:tJ*(F7y0ZR ^p'Ii L24x| XRI%ۄ>S1]Jy[zL$adB7.eh4%%누>WETf+3IR:I3Xה)3אOۦSRO'ٺ)S}"qOr[B7ϙ.edG)^ETR"RtRݜh0}LFVӦDB^k_JDj\=LS(Iv─aTeZ%eUAM-0;~˃@i|l @S4y72>sX-vA}ϛBI!ݎߨWl*)3{'Y|iSlEڻ(5KtSI$Uv02,~ԩ~x;P4ցCrO%tyn425:KMlD ^4JRxSهF_}شJTS6uj+ﷸk$eZO%G*^V2u3EMj3k%)okI]dT)URKDS 7~m@TJR~荪fT"֛L \sM -0T KfJz+nإKr L&j()[E&I ߴ>e FW_kJR|!O:5/2跌3T-'|zX ryp0JS ~^F>-2< `*%ZFP)bSn"L :)+pʷf(pO3TMW$~>@~ū:TAIsV1}S2<%ޟM?@iT ,Eūoz%i~g|`wS(]oȤ8)$ ntu`өe`6yPl IzMI{ʣzʨ )IZ2= ld:5+請M$-ї;U>_gsY$ÁN5WzWfIZ)-yuXIfp~S*IZdt;t>KūKR|$#LcԀ+2\;kJ`]YǔM1B)UbG"IRߊ<xܾӔJ0Z='Y嵤 Leveg)$znV-º^3Ւof#0Tfk^Zs[*I꯳3{)ˬW4Ւ4 OdpbZRS|*I 55#"&-IvT&/윚Ye:i$ 9{LkuRe[I~_\ؠ%>GL$iY8 9ܕ"S`kS.IlC;Ҏ4x&>u_0JLr<J2(^$5L s=MgV ~,Iju> 7r2)^=G$1:3G< `J3~&IR% 6Tx/rIj3O< ʔ&#f_yXJiގNSz; Tx(i8%#4 ~AS+IjerIUrIj362v885+IjAhK__5X%nV%Iͳ-y|7XV2v4fzo_68"S/I-qbf; LkF)KSM$ Ms>K WNV}^`-큧32ŒVؙGdu,^^m%6~Nn&͓3ŒVZMsRpfEW%IwdǀLm[7W&bIRL@Q|)* i ImsIMmKmyV`i$G+R 0tV'!V)֏28vU7͒vHꦼtxꗞT ;S}7Mf+fIRHNZUkUx5SAJㄌ9MqμAIRi|j5)o*^'<$TwI1hEU^c_j?Е$%d`z cyf,XO IJnTgA UXRD }{H}^S,P5V2\Xx`pZ|Yk:$e ~ @nWL.j+ϝYb퇪bZ BVu)u/IJ_ 1[p.p60bC >|X91P:N\!5qUB}5a5ja `ubcVxYt1N0Zzl4]7­gKj]?4ϻ *[bg$)+À*x쳀ogO$~,5 زUS9 lq3+5mgw@np1sso Ӻ=|N6 /g(Wv7U;zωM=wk,0uTg_`_P`uz?2yI!b`kĸSo+Qx%!\οe|އԁKS-s6pu_(ֿ$i++T8=eY; צP+phxWQv*|p1. ά. XRkIQYP,drZ | B%wP|S5`~́@i޾ E;Չaw{o'Q?%iL{u D?N1BD!owPHReFZ* k_-~{E9b-~P`fE{AܶBJAFO wx6Rox5 K5=WwehS8 (JClJ~ p+Fi;ŗo+:bD#g(C"wA^ r.F8L;dzdIHUX݆ϞXg )IFqem%I4dj&ppT{'{HOx( Rk6^C٫O.)3:s(۳(Z?~ٻ89zmT"PLtw䥈5&b<8GZ-Y&K?e8,`I6e(֍xb83 `rzXj)F=l($Ij 2*(F?h(/9ik:I`m#p3MgLaKjc/U#n5S# m(^)=y=đx8ŬI[U]~SцA4p$-F i(R,7Cx;X=cI>{Km\ o(Tv2vx2qiiDJN,Ҏ!1f 5quBj1!8 rDFd(!WQl,gSkL1Bxg''՞^ǘ;pQ P(c_ IRujg(Wz bs#P­rz> k c&nB=q+ؔXn#r5)co*Ũ+G?7< |PQӣ'G`uOd>%Mctz# Ԫڞ&7CaQ~N'-P.W`Oedp03C!IZcIAMPUۀ5J<\u~+{9(FbbyAeBhOSܳ1 bÈT#ŠyDžs,`5}DC-`̞%r&ڙa87QWWp6e7 Rϫ/oY ꇅ Nܶըtc!LA T7V4Jsū I-0Pxz7QNF_iZgúWkG83 0eWr9 X]㾮݁#Jˢ C}0=3ݱtBi]_ &{{[/o[~ \q鯜00٩|cD3=4B_b RYb$óBRsf&lLX#M*C_L܄:gx)WΘsGSbuL rF$9';\4Ɍq'n[%p.Q`u hNb`eCQyQ|l_C>Lb꟟3hSb #xNxSs^ 88|Mz)}:](vbۢamŖ࿥ 0)Q7@0=?^k(*J}3ibkFn HjB׻NO z x}7p 0tfDX.lwgȔhԾŲ }6g E |LkLZteu+=q\Iv0쮑)QٵpH8/2?Σo>Jvppho~f>%bMM}\//":PTc(v9v!gոQ )UfVG+! 35{=x\2+ki,y$~A1iC6#)vC5^>+gǵ@1Hy٪7u;p psϰu/S <aʸGu'tD1ԝI<pg|6j'p:tպhX{o(7v],*}6a_ wXRk,O]Lܳ~Vo45rp"N5k;m{rZbΦ${#)`(Ŵg,;j%6j.pyYT?}-kBDc3qA`NWQū20/^AZW%NQ MI.X#P#,^Ebc&?XR tAV|Y.1!؅⨉ccww>ivl(JT~ u`ٵDm q)+Ri x/x8cyFO!/*!/&,7<.N,YDŽ&ܑQF1Bz)FPʛ?5d 6`kQձ λc؎%582Y&nD_$Je4>a?! ͨ|ȎWZSsv8 j(I&yj Jb5m?HWp=g}G3#|I,5v珿] H~R3@B[☉9Ox~oMy=J;xUVoj bUsl_35t-(ՃɼRB7U!qc+x4H_Qo֮$[GO<4`&č\GOc[.[*Af%mG/ ňM/r W/Nw~B1U3J?P&Y )`ѓZ1p]^l“W#)lWZilUQu`-m|xĐ,_ƪ|9i:_{*(3Gѧ}UoD+>m_?VPۅ15&}2|/pIOʵ> GZ9cmíتmnz)yߐbD >e}:) r|@R5qVSA10C%E_'^8cR7O;6[eKePGϦX7jb}OTGO^jn*媓7nGMC t,k31Rb (vyܴʭ!iTh8~ZYZp(qsRL ?b}cŨʊGO^!rPJO15MJ[c&~Z`"ѓޔH1C&^|Ш|rʼ,AwĴ?b5)tLU)F| &g٣O]oqSUjy(x<Ϳ3 .FSkoYg2 \_#wj{u'rQ>o;%n|F*O_L"e9umDds?.fuuQbIWz |4\0 sb;OvxOSs; G%T4gFRurj(֍ڑb uԖKDu1MK{1^ q; C=6\8FR艇!%\YÔU| 88m)֓NcLve C6z;o&X x59:q61Z(T7>C?gcļxѐ Z oo-08jہ x,`' ҔOcRlf~`jj".Nv+sM_]Zk g( UOPyεx%pUh2(@il0ݽQXxppx-NS( WO+轾 nFߢ3M<;z)FBZjciu/QoF 7R¥ ZFLF~#ȣߨ^<쩡ݛкvџ))ME>ώx4m#!-m!L;vv#~Y[đKmx9.[,UFS CVkZ +ߟrY٧IZd/ioi$%͝ب_ֶX3ܫhNU ZZgk=]=bbJS[wjU()*I =ώ:}-蹞lUj:1}MWm=̛ _ ¾,8{__m{_PVK^n3esw5ӫh#$-q=A̟> ,^I}P^J$qY~Q[ Xq9{#&T.^GVj__RKpn,b=`żY@^՝;z{paVKkQXj/)y TIc&F;FBG7wg ZZDG!x r_tƢ!}i/V=M/#nB8 XxЫ ^@CR<{䤭YCN)eKOSƟa $&g[i3.C6xrOc8TI;o hH6P&L{@q6[ Gzp^71j(l`J}]e6X☉#͕ ׈$AB1Vjh㭦IRsqFBjwQ_7Xk>y"N=MB0 ,C #o6MRc0|$)ف"1!ixY<B9mx `,tA>)5ػQ?jQ?cn>YZe Tisvh# GMމȇp:ԴVuږ8ɼH]C.5C!UV;F`mbBk LTMvPʍϤj?ԯ/Qr1NB`9s"s TYsz &9S%U԰> {<ؿSMxB|H\3@!U| k']$U+> |HHMLޢ?V9iD!-@x TIî%6Z*9X@HMW#?nN ,oe6?tQwڱ.]-y':mW0#!J82qFjH -`ѓ&M0u Uγmxϵ^-_\])@0Rt.8/?ٰCY]x}=sD3ojަЫNuS%U}ԤwHH>ڗjܷ_3gN q7[q2la*ArǓԖ+p8/RGM ]jacd(JhWko6ڎbj]i5Bj3+3!\j1UZLsLTv8HHmup<>gKMJj0@H%,W΃7R) ">c, xixј^ aܖ>H[i.UIHc U1=yW\=S*GR~)AF=`&2h`DzT󑓶J+?W+}C%P:|0H܆}-<;OC[~o.$~i}~HQ TvXΈr=b}$vizL4:ȰT|4~*!oXQR6Lk+#t/g lԁߖ[Jڶ_N$k*". xsxX7jRVbAAʯKҎU3)zSNN _'s?f)6X!%ssAkʱ>qƷb hg %n ~p1REGMHH=BJiy[<5 ǁJҖgKR*倳e~HUy)Ag,K)`Vw6bRR:qL#\rclK/$sh*$ 6덤 KԖc 3Z9=Ɣ=o>X Ώ"1 )a`SJJ6k(<c e{%kϊP+SL'TcMJWRm ŏ"w)qc ef꒵i?b7b('"2r%~HUS1\<(`1Wx9=8HY9m:X18bgD1u ~|H;K-Uep,, C1 RV.MR5άh,tWO8WC$ XRVsQS]3GJ|12 [vM :k#~tH30Rf-HYݺ-`I9%lIDTm\ S{]9gOڒMNCV\G*2JRŨ;Rҏ^ڽ̱mq1Eu?To3I)y^#jJw^Ńj^vvlB_⋌P4x>0$c>K†Aļ9s_VjTt0l#m>E-,,x,-W)سo&96RE XR.6bXw+)GAEvL)͞K4$p=Ũi_ѱOjb HY/+@θH9޼]Nԥ%n{ &zjT? Ty) s^ULlb,PiTf^<À] 62R^V7)S!nllS6~͝V}-=%* ʻ>G DnK<y&>LPy7'r=Hj 9V`[c"*^8HpcO8bnU`4JȪAƋ#1_\ XϘHPRgik(~G~0DAA_2p|J묭a2\NCr]M_0 ^T%e#vD^%xy-n}-E\3aS%yN!r_{ )sAw ڼp1pEAk~v<:`'ӭ^5 ArXOI驻T (dk)_\ PuA*BY]yB"l\ey hH*tbK)3 IKZ򹞋XjN n *n>k]X_d!ryBH ]*R 0(#'7 %es9??ښFC,ՁQPjARJ\Ρw K#jahgw;2$l*) %Xq5!U᢯6Re] |0[__64ch&_}iL8KEgҎ7 M/\`|.p,~`a=BR?xܐrQ8K XR2M8f ?`sgWS%" Ԉ 7R%$ N}?QL1|-эټwIZ%pvL3Hk>,ImgW7{E xPHx73RA @RS CC !\ȟ5IXR^ZxHл$Q[ŝ40 (>+ _C >BRt<,TrT {O/H+˟Pl6 I B)/VC<6a2~(XwV4gnXR ϱ5ǀHٻ?tw똤Eyxp{#WK qG%5],(0ӈH HZ])ג=K1j&G(FbM@)%I` XRg ʔ KZG(vP,<`[ Kn^ SJRsAʠ5xՅF`0&RbV tx:EaUE/{fi2;.IAwW8/tTxAGOoN?G}l L(n`Zv?pB8K_gI+ܗ #i?ޙ.) p$utc ~DžfՈEo3l/)I-U?aԅ^jxArA ΧX}DmZ@QLےbTXGd.^|xKHR{|ΕW_h] IJ`[G9{).y) 0X YA1]qp?p_k+J*Y@HI>^?gt.06Rn ,` ?);p pSF9ZXLBJPWjgQ|&)7! HjQt<| ؅W5 x W HIzYoVMGP Hjn`+\(dNW)F+IrS[|/a`K|ͻ0Hj{R,Q=\ (F}\WR)AgSG`IsnAR=|8$}G(vC$)s FBJ?]_u XRvύ6z ŨG[36-T9HzpW̞ú Xg큽=7CufzI$)ki^qk-) 0H*N` QZkk]/tnnsI^Gu't=7$ Z;{8^jB% IItRQS7[ϭ3 $_OQJ`7!]W"W,)Iy W AJA;KWG`IY{8k$I$^%9.^(`N|LJ%@$I}ֽp=FB*xN=gI?Q{٥4B)mw $Igc~dZ@G9K X?7)aK%݅K$IZ-`IpC U6$I\0>!9k} Xa IIS0H$I H ?1R.Чj:4~Rw@p$IrA*u}WjWFPJ$I➓/6#! LӾ+ X36x8J |+L;v$Io4301R20M I$-E}@,pS^ޟR[/s¹'0H$IKyfŸfVOπFT*a$I>He~VY/3R/)>d$I>28`Cjw,n@FU*9ttf$I~<;=/4RD~@ X-ѕzἱI$: ԍR a@b X{+Qxuq$IЛzo /~3\8ڒ4BN7$IҀj V]n18H$IYFBj3̵̚ja pp $Is/3R Ӻ-Yj+L;.0ŔI$Av? #!5"aʄj}UKmɽH$IjCYs?h$IDl843.v}m7UiI=&=0Lg0$I4: embe` eQbm0u? $IT!Sƍ'-sv)s#C0:XB2a w I$zbww{."pPzO =Ɔ\[ o($Iaw]`E).Kvi:L*#gР7[$IyGPI=@R 4yR~̮´cg I$I/<tPͽ hDgo 94Z^k盇΄8I56^W$I^0̜N?4*H`237}g+hxoq)SJ@p|` $I%>-hO0eO>\ԣNߌZD6R=K ~n($I$y3D>o4b#px2$yڪtzW~a $I~?x'BwwpH$IZݑnC㧄Pc_9sO gwJ=l1:mKB>Ab<4Lp$Ib o1ZQ@85b̍ S'F,Fe,^I$IjEdù{l4 8Ys_s Z8.x m"+{~?q,Z D!I$ϻ'|XhB)=…']M>5 rgotԎ 獽PH$IjIPhh)n#cÔqA'ug5qwU&rF|1E%I$%]!'3AFD/;Ck_`9 v!ٴtPV;x`'*bQa w I$Ix5 FC3D_~A_#O݆DvV?<qw+I$I{=Z8".#RIYyjǪ=fDl9%M,a8$I$Ywi[7ݍFe$s1ՋBVA?`]#!oz4zjLJo8$I$%@3jAa4(o ;p,,dya=F9ً[LSPH$IJYЉ+3> 5"39aZ<ñh!{TpBGkj}Sp $IlvF.F$I z< '\K*qq.f<2Y!S"-\I$IYwčjF$ w9 \ߪB.1v!Ʊ?+r:^!I$BϹB H"B;L'G[ 4U#5>੐)|#o0aڱ$I>}k&1`U#V?YsV x>{t1[I~D&(I$I/{H0fw"q"y%4 IXyE~M3 8XψL}qE$I[> nD?~sf ]o΁ cT6"?'_Ἣ $I>~.f|'!N?⟩0G KkXZE]ޡ;/&?k OۘH$IRۀwXӨ<7@PnS04aӶp.:@\IWQJ6sS%I$e5ڑv`3:x';wq_vpgHyXZ 3gЂ7{{EuԹn±}$I$8t;b|591nءQ"P6O5i }iR̈́%Q̄p!I䮢]O{H$IRϻ9s֧ a=`- aB\X0"+5"C1Hb?߮3x3&gşggl_hZ^,`5?ߎvĸ%̀M!OZC2#0x LJ0 Gw$I$I}<{Eb+y;iI,`ܚF:5ܛA8-O-|8K7s|#Z8a&><a&/VtbtLʌI$I$I$I$I$I$IRjDD%tEXtdate:create2022-05-31T04:40:26+00:00!Î%tEXtdate:modify2022-05-31T04:40:26+00:00|{2IENDB`Mini Shell

HOME


Mini Shell 1.0
DIR:/opt/alt/python38/lib64/python3.8/site-packages/playhouse/__pycache__/
Upload File :
Current File : //opt/alt/python38/lib64/python3.8/site-packages/playhouse/__pycache__/migrate.cpython-38.pyc
U

S��W�]�@s�dZddlmZddlZddlZddlTddlmZddlmZddlmZddlm	Z	dd	lm
Z
dd
lmZGdd�de�Z
d
d�ZGdd�de�ZGdd�de�ZdZGdd�dede��ZGdd�de�ZGdd�de�Zdd�ZdS)a�

Lightweight schema migrations.

NOTE: Currently tested with SQLite and Postgresql. MySQL may be missing some
features.

Example Usage
-------------

Instantiate a migrator:

    # Postgres example:
    my_db = PostgresqlDatabase(...)
    migrator = PostgresqlMigrator(my_db)

    # SQLite example:
    my_db = SqliteDatabase('my_database.db')
    migrator = SqliteMigrator(my_db)

Then you will use the `migrate` function to run various `Operation`s which
are generated by the migrator:

    migrate(
        migrator.add_column('some_table', 'column_name', CharField(default=''))
    )

Migrations are not run inside a transaction, so if you wish the migration to
run in a transaction you will need to wrap the call to `migrate` in a
transaction block, e.g.:

    with my_db.transaction():
        migrate(...)

Supported Operations
--------------------

Add new field(s) to an existing model:

    # Create your field instances. For non-null fields you must specify a
    # default value.
    pubdate_field = DateTimeField(null=True)
    comment_field = TextField(default='')

    # Run the migration, specifying the database table, field name and field.
    migrate(
        migrator.add_column('comment_tbl', 'pub_date', pubdate_field),
        migrator.add_column('comment_tbl', 'comment', comment_field),
    )

Renaming a field:

    # Specify the table, original name of the column, and its new name.
    migrate(
        migrator.rename_column('story', 'pub_date', 'publish_date'),
        migrator.rename_column('story', 'mod_date', 'modified_date'),
    )

Dropping a field:

    migrate(
        migrator.drop_column('story', 'some_old_field'),
    )

Making a field nullable or not nullable:

    # Note that when making a field not null that field must not have any
    # NULL values present.
    migrate(
        # Make `pub_date` allow NULL values.
        migrator.drop_not_null('story', 'pub_date'),

        # Prevent `modified_date` from containing NULL values.
        migrator.add_not_null('story', 'modified_date'),
    )

Renaming a table:

    migrate(
        migrator.rename_table('story', 'stories_tbl'),
    )

Adding an index:

    # Specify the table, column names, and whether the index should be
    # UNIQUE or not.
    migrate(
        # Create an index on the `pub_date` column.
        migrator.add_index('story', ('pub_date',), False),

        # Create a multi-column index on the `pub_date` and `status` fields.
        migrator.add_index('story', ('pub_date', 'status'), False),

        # Create a unique index on the category and title fields.
        migrator.add_index('story', ('category_id', 'title'), True),
    )

Dropping an index:

    # Specify the index name.
    migrate(migrator.drop_index('story', 'story_pub_date_status'))
�)�
namedtupleN)�*)�CommaClause)�EnclosedClause��Entity)�
Expression)�Node)�OPc@s8eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�ZdS)
�	Operationz/Encapsulate a single schema altering operation.cOs||_||_||_||_dS�N)�migrator�method�args�kwargs)�selfr
rrr�r�/migrate.py�__init__uszOperation.__init__cCs|jj��}|�|�Sr)r
�database�compilerZ
parse_node)r�noderrrr�_parse_node{szOperation._parse_nodecCs"|�|�\}}|jj�||�dSr)rr
r�execute_sql)rr�sqlZparamsrrr�executeszOperation.executecCsPt|t�r|�|�n6t|t�r*|��n"t|ttf�rL|D]}|�|�q<dSr)�
isinstancer	rr�run�list�tuple�_handle_result)r�result�itemrrrr �s


zOperation._handle_resultcCs2|j��}d|d<|�t|j|j�|j|��dS)NT�generate)r�copyr �getattrr
rr)rrrrrr�s

�z
Operation.runN)	�__name__�
__module__�__qualname__�__doc__rrrr rrrrrrss	rcst����fdd��}|S)Ncs4|�dd�}|r �|f|�|�St|�jf|�|�S)Nr#F)�poprr&)rrrr#��fnrr�inner�szoperation.<locals>.inner)�	functools�wraps)r,r-rr+r�	operation�sr0c@s�eZdZdZdZdd�Zedd��Zedd��Z	edd	��Z
d
d�Zedd
��Zedd��Z
edd��Zed$dd��Zedd��Zdd�Zedd��Zedd��Zedd��Zed%dd ��Zed!d"��Zd#S)&�SchemaMigratorFcCs
||_dSr)r)rrrrrr�szSchemaMigrator.__init__cCs0t|t�rt|�St|t�r$t|�St|�SdSr)rZPostgresqlDatabase�PostgresqlMigratorZ
MySQLDatabase�
MySQLMigrator�SqliteMigrator)�clsrrrr�
from_database�s


zSchemaMigrator.from_databasecCsJ|j}t|�r|�}ttd�t|�td�tt|�tjt|�	|��dd��S)NZUPDATEZSETT)Zflat)
�default�callable�Clause�SQLrrr
ZEQZParamZdb_value)r�table�column_name�fieldr7rrr�
apply_default�s��zSchemaMigrator.apply_defaultcCsj|jd}|_||_|_|j���|�}||_td�t|�td�|g}t|t	�rb|�
|�|��t|�S)NT�ALTER TABLEz
ADD COLUMN)
�null�name�	db_columnrrZfield_definitionr:rr�ForeignKeyField�extend�get_inline_fk_sqlr9)rr;r<r=Z
field_nullZfield_clause�partsrrr�alter_add_column�s�
zSchemaMigrator.alter_add_columncCs$td�t|jjj�tt|jj��gS)N�
REFERENCES)r:r�	rel_model�_meta�db_tabler�to_fieldrB�rr=rrrrE�s�z SchemaMigrator.get_inline_fk_sqlcCst�dSr��NotImplementedError)rr;r<r=rrr�add_foreign_key_constraint�sz)SchemaMigrator.add_foreign_key_constraintcCs�|js|jdkrtd|��t|t�}|r8|js8td��|�|||�g}|jsn|�|�|||�|�	||�g�|r�|j
r�|�|�|||j
jj|jj��|S)Nz!%s is not null but has no defaultz'Foreign keys must specify a `to_field`.)r@r7�
ValueErrorrrCrLrGrDr>�add_not_null�explicit_create_foreign_key�appendrPrIrJrKrB)rr;r<r=�is_foreign_key�
operationsrrr�
add_column�s*


�
��zSchemaMigrator.add_columncCst�dSrrN�rr;r<rrr�drop_foreign_key_constraint�sz*SchemaMigrator.drop_foreign_key_constraintTcCsrtd�t|�td�t|�g}|r.|�td��t|�}dd�|j�|�D�}||krj|jrj|�||�|gS|SdS)Nr?zDROP COLUMNZCASCADEcSsg|]
}|j�qSr��column)�.0Zforeign_keyrrr�
<listcomp>s�z.SchemaMigrator.drop_column.<locals>.<listcomp>)r:rrTr9r�get_foreign_keys�explicit_delete_foreign_keyrY)rr;r<�cascade�nodesZdrop_column_nodeZ
fk_columnsrrr�drop_column�s �
�
�zSchemaMigrator.drop_columncCs*ttd�t|�td�t|�td�t|��S)Nr?z
RENAME COLUMN�TO�r9r:r)rr;�old_name�new_namerrr�
rename_columns�zSchemaMigrator.rename_columncCstd�t|�td�t|�gS)Nr?zALTER COLUMN)r:r�rr;r[rrr�
_alter_columns
�zSchemaMigrator._alter_columncCs"|�||�}|�td��t|�S)NzSET NOT NULL�rirTr:r9�rr;r[rarrrrR"szSchemaMigrator.add_not_nullcCs"|�||�}|�td��t|�S)Nz
DROP NOT NULLrjrkrrr�
drop_not_null(szSchemaMigrator.drop_not_nullcCsttd�t|�td�t|��S)Nr?z	RENAME TOrd�rrerfrrr�rename_table.s�zSchemaMigrator.rename_tablecCsL|j��}|rdnd}tt|�t|�||��td�t|�tdd�|D���S)NzCREATE UNIQUE INDEXzCREATE INDEX�ONcSsg|]}t|��qSrr�r\r[rrrr]?sz,SchemaMigrator.add_index.<locals>.<listcomp>)rrr9r:r�
index_namer)rr;�columns�uniquerZ	statementrrr�	add_index6s
�zSchemaMigrator.add_indexcCsttd�t|��S)N�
DROP INDEXrd�rr;rqrrr�
drop_indexAs�zSchemaMigrator.drop_indexN)T)F)r&r'r(rSr_r�classmethodr6r0r>rGrErPrWrYrbrgrirRrlrnrtrwrrrrr1�s>




!

	



r1cs(eZdZdd�Ze�fdd��Z�ZS)r2cCs&d}|j�||�}dd�|��D�S)Nai
            SELECT pg_attribute.attname
            FROM pg_index, pg_class, pg_attribute
            WHERE
                pg_class.oid = '%s'::regclass AND
                indrelid = pg_class.oid AND
                pg_attribute.attrelid = pg_class.oid AND
                pg_attribute.attnum = any(pg_index.indkey) AND
                indisprimary;
        cSsg|]}|d�qS�rr)r\�rowrrrr]Usz;PostgresqlMigrator._primary_key_columns.<locals>.<listcomp>)rr�fetchall)rZtbl�query�cursorrrr�_primary_key_columnsIs
z'PostgresqlMigrator._primary_key_columnsc
s�|�|�}tt|�}|j||dd�g}t|�dkr�d||df}d}|j�||f�}t|���r�d||df}	|�	|j||	dd��|S)NT)r#�z	%s_%s_seqrz�
                SELECT 1
                FROM information_schema.sequences
                WHERE LOWER(sequence_name) = LOWER(%s)
            )
r~�superr2rn�lenrr�bool�fetchonerT)
rrerfZpk_namesZParentClassrVZseq_namer|r}Znew_seq_name��	__class__rrrnWs 

��zPostgresqlMigrator.rename_table)r&r'r(r~r0rn�
__classcell__rrr�rr2Hsr2)rA�
definitionr@�pkr7�extrac@s:eZdZedd��Zedd��Zedd��Zd
dd	�ZdS)�MySQLColumncCs
|jdkS)NZPRI�r��rrrr�is_pkrszMySQLColumn.is_pkcCs
|jdkS)NZUNIr�r�rrr�	is_uniquevszMySQLColumn.is_uniquecCs
|jdkS)NZYES)r@r�rrr�is_nullzszMySQLColumn.is_nullNcCs�|dkr|j}|dkr|j}t|�t|j�g}|jrB|�td��|rV|�td��n|�td��|jrx|�td��|jr�|�t|j��t	|�S)NZUNIQUEZNULL�NOT NULLzPRIMARY KEY)
r�rArr:r�r�rTr�r�r9)rr<r�rFrrrr~s"�zMySQLColumn.sql)NN)r&r'r(�propertyr�r�r�rrrrrr�qs


r�Z_Columnc@s�eZdZdZdZedd��Zdd�Zedd��Zdd	�Z	ed
d��Z
dd
�Zedd��Zedd��Z
edd��Zedd��ZdS)r3TcCsttd�t|�td�t|��S)NzRENAME TABLErcrdrmrrrrn�s�zMySQLMigrator.rename_tablecCs@|j�d|�}|��}|D]}t|�}|j|kr|SqdS)NzDESCRIBE %s;F)rrr{r�rA)rr;r<r}Zrowsrzr[rrr�_get_column_definition�s

z$MySQLMigrator._get_column_definitioncCsRd|||f}ttd�t|�td�t|�td�tt|��td�t|�tt|���	S)Nzfk_%s_%s_refs_%sr?zADD CONSTRAINTzFOREIGN KEYrH)r9r:rr)rr;r<ZrelZ
rel_columnZ
constraintrrrrP�s

�z(MySQLMigrator.add_foreign_key_constraintcCs6|j�d||f�}|��}|s.td||f��|dS)Nz�SELECT constraint_name FROM information_schema.key_column_usage WHERE table_schema = DATABASE() AND table_name = %s AND column_name = %s;z=Unable to find foreign key constraint for "%s" on table "%s".r)rrr��AttributeError)rr;r<r}r!rrr�get_foreign_key_constraint�s���z(MySQLMigrator.get_foreign_key_constraintc	Cs&ttd�t|�td�t|�||���S)Nr?zDROP FOREIGN KEY)r9r:rr�rXrrrrY�s�z)MySQLMigrator.drop_foreign_key_constraintcCsgSrrrMrrrrE�szMySQLMigrator.get_inline_fk_sqlcCs.|�||�}ttd�t|�td�|jdd��S)Nr?�MODIFYF�r�)r�r9r:rrrhrrrrR�s
�zMySQLMigrator.add_not_nullcCs<|�||�}|jrtd��ttd�t|�td�|jdd��S)NzPrimary keys can not be nullr?r�Tr�)r�r�rQr9r:rrrhrrrrl�s
�zMySQLMigrator.drop_not_nullc	Cs�tdd�|j�|�D��}||k}|�||�}ttd�t|�td�t|�|j|d��}|r�||}|�||�||�	|||j
|j�gS|SdS)Ncss|]}|j|fVqdSrrZ)r\Zfkrrr�	<genexpr>�s�z.MySQLMigrator.rename_column.<locals>.<genexpr>r?ZCHANGE)r<)�dictrr^r�r9r:rrrYrPZ
dest_tableZdest_column)	rr;rerfZ
fk_objectsrUr[Z
rename_clauseZfk_metadatarrrrg�s0
�
�
��
zMySQLMigrator.rename_columncCsttd�t|�td�t|��S)Nrurordrvrrrrws�zMySQLMigrator.drop_indexN)r&r'r(rSr_r0rnr�rPr�rYrErRrlrgrwrrrrr3�s&
	





r3c@s�eZdZdZe�d�Ze�d�Ze�d�Ze�dej	�Z
dd�Zdd	�Ze
d
d��Zdd
�Ze
ddd��Ze
dd��Ze
dd��Ze
dd��ZdS)r4z�
    SQLite supports a subset of ALTER TABLE queries, view the docs for the
    full details http://sqlite.org/lang_altertable.html
    z
(.+?)\((.+)\)z(?:[^,(]|\([^)]*\))+z
["`']?([\w]+)z FOREIGN KEY\s+\("?([\w]+)"?\)\s+cCs |j�d|�}dd�|jD�S)Nzselect * from "%s" limit 1cSsg|]}|d�qSryr)r\r"rrrr]sz4SqliteMigrator._get_column_names.<locals>.<listcomp>)rr�description�rr;�resrrr�_get_column_namessz SqliteMigrator._get_column_namescCs|j�dd|��g�}|��S)NzBselect name, sql from sqlite_master where type=? and LOWER(name)=?r;)rr�lowerr�r�rrr�_get_create_tables

�z SqliteMigrator._get_create_tablec	stdd��j�|�D��}|��|kr6td||f����|�\}}�j�|�}�j�|�t�	dd|�}�j
�|���\}}�j
�|�}	dd�|	D�}
g}g}g}
|
D]�}�j�|���\}||k�r
|||�}|�r6|�|�|
�|��j�|���\}|�|�q�|�|�|���d�s�|�|�|
�|�q�tt|
|��}|�|��d	d
�}��shdd
�}n�|k�r���fdd
�}g}|D]F}�j�|�}|dk	�r�|��d
|k�r�||�}|�r�|�|��q�|d}t�d|tj�}|�	d||�}d�|�}ttd�t|��td|��|f�g}ttd�t|�tdd�|D��td�tdd�|
D��td�t|��}|�|�|�ttd�t|���|��� ||��t!dd
�|�D]R}||j"k�r�|�t|j#��n.��r���$|j#|��}|dk	�r�|�t|���q�|S)Ncss|]}|j��VqdSr)rAr�rprrrr� s�z0SqliteMigrator._update_column.<locals>.<genexpr>z"Column "%s" does not exist on "%s"z\s+� cSsg|]}|���qSr��strip�r\�colrrrr]8sz1SqliteMigrator._update_column.<locals>.<listcomp>)ZforeignZprimarycSs|Srr��
column_defrrr�<lambda>S�z/SqliteMigrator._update_column.<locals>.<lambda>cSsdSrrr�rrrr�Vr�cs�j�d�|�S)NzFOREIGN KEY ("%s") )�fk_re�subr���
new_columnrrrr�Ys�rZ__tmp__z
("?)%s("?)z\1%s\2�, zDROP TABLE IF EXISTSz%s (%s)zINSERT INTOcSsg|]}t|��qSrrr�rrrr]vsZSELECTcSsg|]}t|��qSrrr�rrrr]xsZFROMz
DROP TABLEcSs|jSr)r)�idxrrrr��r�)%�setrZget_columnsr�rQr�Zget_indexesr^�rer��	column_re�search�groups�column_split_re�findall�column_name_re�matchrT�
startswithr��zip�getr��compile�I�joinr9r:rr�rrrn�filterrrr�
_fix_index)rr;�column_to_updater,rrZcreate_tableZindexesZ
raw_createZraw_columnsZ
split_columnsZcolumn_defsZnew_column_defsZnew_column_namesZoriginal_column_namesr�r<Znew_column_defZoriginal_to_newZfk_filter_fnZcleaned_columnsr�Z
temp_tableZrgxZcreateZqueriesZpopulate_table�indexrrr�r�_update_columns�
��



�





�
��
�
zSqliteMigrator._update_columnc
Cs�|�|�}t|�dkr"|�||�S|�dd�\}}t|�|��dkrXd||�||�fS|�dd�d�d�}dd	�|D�}g}|D]2}	t�d
||	�r�t|	t|�d�}	|�|	�q�d|d�d
d�|D��fS)N��(rz%s(%s�)r�,cSsg|]}|�d��qS)z"`[]' r�)r\�partrrrr]�sz-SqliteMigrator._fix_index.<locals>.<listcomp>z%s(?:['"`\]]?\s|$)z%s(%s)r�css|]}d|VqdS)z"%s"Nr)r\�crrrr��sz,SqliteMigrator._fix_index.<locals>.<genexpr>)	�splitr��replace�rsplitr�r�Znew_columnerTr�)
rrr�r�rFZlhsZrhsrrZcleanr[rrrr��s
zSqliteMigrator._fix_indexTcCs|�||dd��S)NcSsdSrr)�a�brrrr��r�z,SqliteMigrator.drop_column.<locals>.<lambda>�r�)rr;r<r`rrrrb�szSqliteMigrator.drop_columncs�fdd�}|�|||�S)Ncs|�|��Sr�r��r<r��rfrr�_rename�sz-SqliteMigrator.rename_column.<locals>._renamer�)rr;rerfr�rr�rrg�szSqliteMigrator.rename_columncCsdd�}|�|||�S)NcSs|dS)Nz	 NOT NULLrr�rrr�
_add_not_null�sz2SqliteMigrator.add_not_null.<locals>._add_not_nullr�)rr;r[r�rrrrR�szSqliteMigrator.add_not_nullcCsdd�}|�|||�S)NcSs|�dd�S)Nr��r�r�rrr�_drop_not_null�sz4SqliteMigrator.drop_not_null.<locals>._drop_not_nullr�)rr;r[r�rrrrl�szSqliteMigrator.drop_not_nullN)T)r&r'r(r)r�r�r�r�r�r�r�r�r�r0r�r�rbrgrRrlrrrrr4	s$



p

r4cOs|D]}|��qdSr)r)rVrr0rrr�migrate�sr�)r)�collectionsrr.r�Zpeeweerrrrr	r
�objectrr0r1r2Z_column_attributesr�r3r4r�rrrr�<module>s*e 	-'"v=