From c30dc7cc48008f7ab385adec52d766f3cf4d3f9d Mon Sep 17 00:00:00 2001 From: CACode Date: Sat, 17 Apr 2021 10:17:31 +0800 Subject: [PATCH 01/21] edit .gitignore --- .gitignore | 1 + imgs/lct.png | Bin 0 -> 35815 bytes 2 files changed, 1 insertion(+) create mode 100644 .gitignore create mode 100644 imgs/lct.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..485dee6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea diff --git a/imgs/lct.png b/imgs/lct.png new file mode 100644 index 0000000000000000000000000000000000000000..cbd6c8339351a6dced8eadc71b96c9d7ce962ef5 GIT binary patch literal 35815 zcmd43cRZZowl*wPL`bv{HF_ta4T6XkMDIP(JEKNVA_>C`(W5hZk6woqMkjhFj9#O6 zzGq0Xv-dgsyyrdd_x`@mKYqsj-1oZMTGw^0^$bKwK^o^K=}im_3>=xK5-J!NSDs*C zT;9BK8TjPo>#b=Fj8_;k5@KpE4OS2*;pB}8g`TH4CqHofPrgCOUaS)ZeK9cD9U83J zYZsi(6A)Scyjzuw18RW%XyhXIgx!(iwBBO4jwSOx^ew&FXM7T}s}o;_DE%H>#=c8( zC+yP)609qlQltoKENU3tl9~E|oQ9c(tE+mKvwGK71A&U7x~s-cdj+>>c>nlT(rLZQ zql207OMqz@AiPi+MdbvP=pxzieI)v$(zhg-z_0I51HkA8u>a+s-)|wW9hR4qP^^TI zknb#K{(Ol-rKbA%O`Kq0d{*P~GaBm_4=)tq-dIWXY^wM&}N*7o}LYTOBv8GEXsbF<1PXxa2CzqsCj6yDBY(L_rK_(dEuzQfzEGiELg^Om>T0jY}9F?VWnYJDka~>SN5~Rm+`G|wxbAwZ+lOCY@(aeg4ifuB;2<Ti6 zzjUvs`?sW|cUfTot2g5p&g855MRxx&MO1#LJc^ubA#_>_p zjx$kA7hk zIRSSYKo}ppw;iEE9u}MaXXFNQ>Vs2ijjq6Wi~B;95s|!3u4V8}j~Fek@z zjrYwePx@r4yO}TN+N@rKUkJmFj_s$iEGCThu1~eM7#lhsz`)oRL6D;iyv?RF&Niq- z>%4OB{ZR3JG>_9QRob_%hc#boO)q+ncqVJNnq9B4d0bn6lKcB@duuDU@}Vn|Z^LvB zo$|5GUheF-KKXF45=kZPsJG*3d{8B1 ztS9?&gQxmu;!b3kUQG0$7HW6cy?H$}>{99@-j8+j)JK*Lp@XO2ZW-&5DzVQ@WV6&j z2k(@mH$1@3nA`vv;iE8~OZB#Ktqn`>1qPJw=ZMBEva7EU*`EF!GC1i}|J2@S2OS=Z zMU5x)PM@dmn0%vO@h&zG`-hSb3yJ;HT?+x<*C35u-QFJv<4yRiuNx2C2)P)DPSEmTvc; zW_GSS8sfj6k>chU>U_Eg60Soj&--kapO)HNRi^$tif0^r@r2|P=4`dD^FEX9qKx8^ z`>b#E@RBx1c2i2nGtFT?OZSPz)J`ArlO>}h7+dC?&vgt8?so>kV0};9_=n!r-va6Q zqZzdv<9#dU$VtOPNF+Pjjaf6ZYBe9|J3tgN9b(HHL2YS59GrcY*iRP|yzAx6#6!Xr zk05LKlPRL^g)(bX+6v7F@~%AXNwGd7_}t2OeUi2s7%3R2-5b?byIfhiT{JhmxeVzU zWkiJR9(bUvoUPTWV(K$ha=Rr*!P4GzB>fq+qvlb1eb{6Y>-imD<7ThOVPKfy0_XHi z0Ya5GuILd1u?w;!)MaWsKh$JJC@?mC6b327U`JYFb}$J(C*cnhver^jJs>fsciVg+ zDibI-X$`kg!?h#NwD3PIE3*vTO~ujO4q;e@bIY7L_(M}=Zjbnb-&V<63+5OswO4d1 zg>c}K6%@9}x4Jz(sAJ+MYHyB0h*8rCz>WvfuxGnlqnBrE!sTB3ZIafGXbE4zcoicS z(gd1yLY0#ykrA6!W*>}!TwM7w>~Pwi6@)uajoZF(XkKTsGJBtzm+o>H!f@Eb#WCpa z^|`d9G-ao5E=Gs+FupbxHPf-ssr?jU&)mcptXe95HZq~+9xhd&?R>&*Y2Lyz=hj-> zMYVHdaadBH(Qu~%3U-V`8Rai;T#Z6>HyV1U@J(3rT*vq*v;7i^J!1&oH`vr9pR2_? zCGr=rZ}4rL@>Jc`B=5uG!DeLMunvDSb~El2YiBq*Cb-IVZ!0V5a**#fKKN3Dd+VX8SB0 zdlJ|s3^Q^B73z(H{93r>SzJzQJezq8PnzT+Ta2?!XiLvK`u3+ctJN8QK3HpsQS@F; z>DC=%+lzWU8y`WSE@~j}Y~@oOL$CC7<+YTec9qkoM~<^~hx*v0Q09anBUBy%CB{^!#EG#qPa@3KDi zGgnKCQeg&+SNA?c1HfUa{tSkIqr4rmN_6JBFO1_#uB!BKk?G*;Lu_UWrjlIgiZ!#1 zCeJbpqA;OsxHiaAO%SQ=(OHn_LWdm2r7oJVkK(;F;v>~KDKZ;pBb@R^-^xFVD%}10 z0EU^^;!uxFwdQcNGaG+8``2$I!|XNp%5YKO0(HlaZ&$prh9|Gfk;a7ZRr{}2TfHPi z0D%r_biJ|C?t^ZEasctWF=h__y*Y-(yW<%h?HW2kAG}h>`Z-tgp!J$}`0%*FJ&MKo z50pr<>8agtUtE6p4YE^L&Rxc5F{J&xSw5I?!6Wd64q zC1J0kx-LH}38(YCF>KtPS$W(g-euPSs=D&t4`BV2T8Qi_2=tO3hR2#t_lDId_YT$ywpe8WED?wFCgL(;YlboPh2;z z)zBt{EX)0Yylmqod3}2}JN37CsBM2!T1#2zl~*x0xNwtq)2I;EdieJ5DpPk9mKa-! zIB0@HGTkUB+8gOyX1R`>tGzhEV``@)ag4UYBju!5Ft$m7fDRyKsVC4Yz;6q>|LcGD zSaaDeJ5dR{OioQvDI6b{`(1I`r2&2hR72G%<3%?{%cPNpLfM$4q8^OMRbRKwFV_g- zl0fCQy;xw~NgTjRC2o_B$_aMC+9oaT-XYs?5_}9d`D6-_x{BH)KTZ+e@xfw zkG^csn(yQ{@`xa90k&XHWyM*IrWJi3iY6(1Uwq^8w&sF`fK$b#4SeTly;*^OJ?n`0Qlub&2^Sjws48 zPmk5HlfwZcQYw^>�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 literal 0 HcmV?d00001 -- Gitee From 61d52259a4cc70a39aff0b7b9cbb6d82ee0cbb7e Mon Sep 17 00:00:00 2001 From: CACode Date: Sat, 17 Apr 2021 10:19:38 +0800 Subject: [PATCH 02/21] delete .idea --- .idea/.gitignore | 8 ---- .idea/CACodeFramework-python-ORM.iml | 12 ------ .idea/inspectionProfiles/Project_Default.xml | 38 ------------------- .../inspectionProfiles/profiles_settings.xml | 6 --- .idea/misc.xml | 4 -- .idea/modules.xml | 8 ---- .idea/vcs.xml | 6 --- 7 files changed, 82 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/CACodeFramework-python-ORM.iml delete mode 100644 .idea/inspectionProfiles/Project_Default.xml delete mode 100644 .idea/inspectionProfiles/profiles_settings.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 8f02d69..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Datasource local storage ignored files -/../../../../:\Github\CACodeFramework-python-ORM\.idea/dataSources/ -/dataSources.local.xml -# Editor-based HTTP Client requests -/httpRequests/ diff --git a/.idea/CACodeFramework-python-ORM.iml b/.idea/CACodeFramework-python-ORM.iml deleted file mode 100644 index 5ed0139..0000000 --- a/.idea/CACodeFramework-python-ORM.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index da48479..0000000 --- a/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml deleted file mode 100644 index 105ce2d..0000000 --- a/.idea/inspectionProfiles/profiles_settings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index d56657a..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 99e9e95..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file -- Gitee From ad77fe625d1fef440f496f206ae382944a03108e Mon Sep 17 00:00:00 2001 From: CACode Date: Sat, 17 Apr 2021 10:32:07 +0800 Subject: [PATCH 03/21] =?UTF-8?q?=E7=A6=81=E6=AD=A2=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 禁止使用 --- .gitignore | 6 ++++++ .../__pycache__/Annotations.cpython-39.pyc | Bin 2782 -> 0 bytes .../__pycache__/CACodePojo.cpython-39.pyc | Bin 5303 -> 0 bytes .../__pycache__/CACodePureORM.cpython-39.pyc | Bin 8702 -> 0 bytes .../CACodeRepository.cpython-39.pyc | Bin 9340 -> 0 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 254 -> 0 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 174 -> 0 bytes .../__pycache__/e_except.cpython-39.pyc | Bin 1364 -> 0 bytes .../opera/__pycache__/__init__.cpython-39.pyc | Bin 170 -> 0 bytes .../opera/__pycache__/obj_dict.cpython-39.pyc | Bin 3229 -> 0 bytes .../opera/__pycache__/op_db.cpython-39.pyc | Bin 3183 -> 0 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 372 -> 0 bytes .../field/__pycache__/__init__.cpython-39.pyc | Bin 161 -> 0 bytes .../field/__pycache__/e_fields.cpython-39.pyc | Bin 360 -> 0 bytes .../field/__pycache__/field_tag.cpython-39.pyc | Bin 1367 -> 0 bytes .../__pycache__/sql_fields.cpython-39.pyc | Bin 1159 -> 0 bytes .../util/__pycache__/Config.cpython-39.pyc | Bin 2284 -> 0 bytes .../util/__pycache__/DbUtil.cpython-39.pyc | Bin 5556 -> 0 bytes .../util/__pycache__/JsonUtil.cpython-39.pyc | Bin 4243 -> 0 bytes .../util/__pycache__/Log.cpython-39.pyc | Bin 3901 -> 0 bytes .../util/__pycache__/ParseUtil.cpython-39.pyc | Bin 2954 -> 0 bytes .../util/__pycache__/__init__.cpython-39.pyc | Bin 160 -> 0 bytes README.md | 16 ++++++++++------ delete.py | 17 +++++++++++++++++ upload.bat | 1 + 25 files changed, 34 insertions(+), 6 deletions(-) delete mode 100644 CACodeFramework/MainWork/__pycache__/Annotations.cpython-39.pyc delete mode 100644 CACodeFramework/MainWork/__pycache__/CACodePojo.cpython-39.pyc delete mode 100644 CACodeFramework/MainWork/__pycache__/CACodePureORM.cpython-39.pyc delete mode 100644 CACodeFramework/MainWork/__pycache__/CACodeRepository.cpython-39.pyc delete mode 100644 CACodeFramework/MainWork/__pycache__/__init__.cpython-39.pyc delete mode 100644 CACodeFramework/MainWork/exception/__pycache__/__init__.cpython-39.pyc delete mode 100644 CACodeFramework/MainWork/exception/__pycache__/e_except.cpython-39.pyc delete mode 100644 CACodeFramework/MainWork/opera/__pycache__/__init__.cpython-39.pyc delete mode 100644 CACodeFramework/MainWork/opera/__pycache__/obj_dict.cpython-39.pyc delete mode 100644 CACodeFramework/MainWork/opera/__pycache__/op_db.cpython-39.pyc delete mode 100644 CACodeFramework/__pycache__/__init__.cpython-39.pyc delete mode 100644 CACodeFramework/field/__pycache__/__init__.cpython-39.pyc delete mode 100644 CACodeFramework/field/__pycache__/e_fields.cpython-39.pyc delete mode 100644 CACodeFramework/field/__pycache__/field_tag.cpython-39.pyc delete mode 100644 CACodeFramework/field/__pycache__/sql_fields.cpython-39.pyc delete mode 100644 CACodeFramework/util/__pycache__/Config.cpython-39.pyc delete mode 100644 CACodeFramework/util/__pycache__/DbUtil.cpython-39.pyc delete mode 100644 CACodeFramework/util/__pycache__/JsonUtil.cpython-39.pyc delete mode 100644 CACodeFramework/util/__pycache__/Log.cpython-39.pyc delete mode 100644 CACodeFramework/util/__pycache__/ParseUtil.cpython-39.pyc delete mode 100644 CACodeFramework/util/__pycache__/__init__.cpython-39.pyc create mode 100644 delete.py diff --git a/.gitignore b/.gitignore index 485dee6..4d2e040 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,7 @@ .idea +__pycache__/ +setup.py +upload.bat +pyproject.toml +delete.py + diff --git a/CACodeFramework/MainWork/__pycache__/Annotations.cpython-39.pyc b/CACodeFramework/MainWork/__pycache__/Annotations.cpython-39.pyc deleted file mode 100644 index f8c58dfeae26ae8cd288a70af163dc1c38a14678..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2782 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 diff --git a/CACodeFramework/MainWork/__pycache__/__init__.cpython-39.pyc b/CACodeFramework/MainWork/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 5c70e4f5f15a98629aa4c960d98cb2cbf49c3057..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 254 zcmYe~<>g`kg7AB836VhhF^Gc(44TZh zIO5}T6EpMTszPR7Nl|`EX>v(s zex9Eu6G(GjVs2`D{4LgkBB10-h9VZARbb+mr@K{*JJ^&MXGiD!lvKAOpxW~MqHNuQ z%94!yJYD}FUv#M$U!Y^cfofvn<1_OzOXB183My}L*yIAO%}KRm1o;N!Ee=KipE*cu diff --git a/CACodeFramework/MainWork/exception/__pycache__/__init__.cpython-39.pyc b/CACodeFramework/MainWork/exception/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 5c21c0cdea6d85f7db1f3b09a11612f523499b8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174 zcmYe~<>g`k0{6hu1Q7igL?8o3AjbiSi&=m~3PUi1CZpdmTHcE*0aOn3)$2R1=e0k(^pkl9`_u6Ca2KczG$)edCYXCP((0NMU5Z~y=R diff --git a/CACodeFramework/MainWork/exception/__pycache__/e_except.cpython-39.pyc b/CACodeFramework/MainWork/exception/__pycache__/e_except.cpython-39.pyc deleted file mode 100644 index ada947f55639221d46c2c7efd801b2a60f578755..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1364 zcmb6ZU2hvjaQE(fcQ#3dDnL{qbQ1D|ADr5W6;cZ!ObDq_Y@;MngyUi^-gA1X?X&jI zO4FRB&@_C7d>~39wV|@Bq86dhRG^ZiCix%titp?^@m_?&?m0!J5)aJX?9R;2&dkov ztlZu00|fexXFs0z0Ps6yo(7gMZxht}$$$WY1yBTO04dEBU>cH{Eigqk%@Uaxc@TdM zra2@a@ft{b5Hkh>z9X_11fV4%*-#9%s3a+)Wb>+0K>B0e>rKSs$sAABPCz8Hm*5~l z{Ub6Mpa$!p#voXSh(YWUa|Tp-#MM}nH(7(5@ff@b7NH4hLLHbMlc@_;!4PM>reOGx z$ApMq;UF+M#8ea5C5lDr z-!^wwnvEOH-EC)MyLE5b-d}4UuD9!7ov76sc4O_2#*Ge39XOj0k2ZgiS`QxCx0VU# zI$B?8-QAJw`+MyNb$e^a{%%2P-~O?^v)H?Cxr&0y^&~WpeNjaPMU~~CZ$edg73

o!g^(UhKu^xXudGy!u@$r?{=BrZYpPa7}C;tr8 z=zP`UXaE5=E#^qgO>21067y<7Dal2};^|sR3v^+IR92d=7`c)*Yl*sn^RzrIKCj`T zY+zdb=~E-A;cV)Iq0v}28A}XVjEXEFnEN5~o|;l*%fX%LO&38kTU9QH!JU zfM~JW)C{I2Zm~sunz+c)1FC4OzdGbt8m^#i^yd_5;8#lP!Zcpr4Nax_m*fYKD**6bpL2~4;MuR;V#BQcdpBKkj# z5xt-yTuSQ48g`kg5=cF1Q7igL?8o3AjbiSi&=m~3PUi1CZpdmTHcE*0aOn3)$2R1=e5kXn=&6Ca2KczG$)edCQXCP((060!68-Mkc-ld6GG}Hb)&`da0gJ~1aR9V%{qBmSU&J|TPZPQa#1kgpC2$kvF z!|_Xo+p9mysnk);oyivyNYX0EnF4h`RCgCN9=S*xq%4%hdcu>+33zM57d^S0g!f81 zU6$*zF2I|`+7Td6541}2_SxXX`sT()@P|ft>T_%Wo_g7t9-k^3MK7OK zxab~tc}kr&yb?+iNvE{p3|C4jo?<%;0pt?yXNV`44&}$jvq^@J=Mpl-9*Kr{72AnJ zLAAJK+9f9fE^bi9T(q3&J{ZKpRx-j|x+QE_xKDNPy5Ax72sA#`=@Xo#k_I_O zSq{cRIsPMT4~})=38WPE5?j&5c;utKNVS8YnVa9OHRqRdvHA>zYxBYCnY*{nH*bHi zxqfEP3ww4y|I6oh@99c(>z#iDx4&p!UJOqD`G;EFc>ZSi%{jR6hg+wE&)>a|71MSN<_&evLjG!1UGt2dN!_pv&)7z| z&-0i$Rr3rtw`~^p7ahA4>0Hd{-LE$~8p+eRXinoYPg8AtR4S^+dI$eg&n2QF8?#? z;if7SX-H#1>3ZBAKRc6|r z3fGUZ0hnOFzy|$j*Bsfi@cS#MvG6n7gx}v1e&>`T8e_ZQG3X0%&MiZ8lAuY}#gn8= z>(Vr-Cr*$O7%W5-#g|6O0?w{5@RQfvS1=v+$GEaOID|(xv9LFN2j!UFjXlA9?B3 zqXUQXN5=;yRn^m`EF*G=syexA(lb5Fm>e2}U<1C;9n22AzVGGNUK-dnI5;#onC%|Z za=%rl?BouQ|8_ifz8wzQ-ua&MbIrz;V0F1m#0;;->|AH!9(6_+i}HLFs{0dYrioA9 z=&Mr?BkN0;k8WQZ6BTU1)iFuVuPk(Wz8N3UJ_m zppv=4HmVq^A@-ru7~X3+Ma^PAVc zSss_QYSplHhT)TEq6=ClXH&5Q$l^-hz4GUY=y3LPSOe!!RgY;_4WdufxtyAumgCo8 zXk{2Y*luW|aDXv}q!mFHB)XIKLsf(foqO~FuLEgG;03jN)E6@g6!(6p?hrH(x*;iP z&^km64C0`qkAad(5Xc2zMCDr$K^b@YsDQNAge@H)gX{0b=G)T5ldC=Y5q@(eTwK{) ze}AiSvx`4kal9}5%cXFAHMq01)!2ZjF*=1Q+vbh;!@q(;e+sDq5P%EmT-ee#d{r)3 zK8N{2(uJAX!S7o>6gm(rxLU z9D|GQBZ9qiS3$v>qsSmaG~kH{(-_Ri|3sNUD%KQ;A5(||CKDu`1~B{RT*vuDY6>J- zfnj*aXVaLoVV9%bvsrqf6xFBIN;9fXt6!HnEMJ z4o?hq0{&rHSR$h#4I3$ztMS<8mjGp^CG#`&H~wt>L%(kN0*y-u(RiwcX#o zxBcPToq`oaNgjB`r}@H7G$BFcglA@@}F&F$*h?l11r4L3*e@VR8!M-)~%+yM8HF zH@l7NC9to_upQmb4vMz_*J$+Npc8D>gft*6NE6cTTP>EqqIkmThOvroxZVd_ni&SnQ~fg-vp*c-xltgwd(fWb#H@dO_qP4*K>t; z=vwZ2MQgHF706e*-^cN^2g%D@pWWH|_$QAyH@806*dIKvl#Cl)73FjLW2C&;O`CJO zpWfa1d-6UHIvPP?J6&A_DZ0AdbmBNih1!;1*(TbW1vyMWHMCu?0;YQ%QtT_v9qR(B@Cj$~Kv}tPkRw!Se0G2$T-YvI4;{`7Ek0pyVe} zG1oIZ#FN8oro*dzMz^0aJfnAXIKuS)BjH84LFA;vi#G4G7E&xmn0>_W6Up%IMGPZJ zckldYuFQto_M`Q09e&(gK`_3xeKITDi(a|7Sj8hRb zRv@DUj*}BueayIGa-bF_Nf4ZYLQaS?t9N|Znqj38qioVe(MG+7hJs0g3nPX}>wE** zql~`!G*c*L{ya^YM7dSw z3Me`eL1um{sXLOaC@LjwEk~dcja;rIS~6<~)It*I(RP@w081TH_E=0IMhWWNcd;&g zHHNnQ5;pn$J@Cs3?qDT%*V-kXFIkE#sh1 ztc?+q0!)4dAJi>bfq=m>PE~-T?neO~dtjSU+D4=}ZUyan4kahHWX=qqv3n;Dv7m%% zyJ#G8dc@C(5ert0CFsEl<05k)rBo)Hu+|K^z}B6$g`k0N(zdt^!3v-OEOB6Kw|pI$t7ipDY=<>`VdWUV|5F_M(X+p z`TA+H-r|mrFH0>d&dkq?kB{Pyk55T0PASX667z z*yH0%i-3%k3`NX9KZ1#04(?Vl?qGMs;IPO2R! N1dBO<1Pdbs0swu7Zc+dM diff --git a/CACodeFramework/field/__pycache__/__init__.cpython-39.pyc b/CACodeFramework/field/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 14fd6f3a47017501306157201c02fff0abd9bcb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161 zcmYe~<>g`kg6ms66F~H15P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!HUyH$*PW=TeA zQjD{sbAC#yTTxQVBW@=7KOniK1US>&ryk0@&Ee@O9 Q{FKt1R6CIQpMjVG00Ors+W-In diff --git a/CACodeFramework/field/__pycache__/e_fields.cpython-39.pyc b/CACodeFramework/field/__pycache__/e_fields.cpython-39.pyc deleted file mode 100644 index bd1eed38e799d2b4a63fb364ff8ab1933683d347..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 360 zcmYe~<>g`kf}XI_gq=Y8F^Gc<7=auIATCw_5-AK(3@MCJj44b}OexG!%qc8UEGeu} ztSM|!Y$@!)44NEO9L|o;`6;QoUT{`0oaI<036*t8EJ;jCEKb$+FGwv)EXmBzyTuaj z802@0#naEtze>o(F~rfyG1yhXKfpD}F~rl~&rg#*ipwk5-!I-ZD9Ar3iYGYIFT^nd z%Hwhj2?>I*Z}Iu~yT^m|#rrw>x)yMKCiV|~E%kzt}bqgv>GV=3u{eyhbrDD=DQ*%;cQscpNv0g#tEe@O9{FKt1 PR6CG;#XLZQg%JS(W))o~ diff --git a/CACodeFramework/field/__pycache__/field_tag.cpython-39.pyc b/CACodeFramework/field/__pycache__/field_tag.cpython-39.pyc deleted file mode 100644 index 78277e87aa949ab9c562dd91b64809c3d6e6ff12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1367 zcmah|-D}fO6u;?5(x#hkC?X272T}5{{Q*H_GH9QypuSiJ*R;vjY;99-615{QYGtU* z33Hnu3>DE$uuL}RKA8R=_f?a&&w>v=d2af#nhBn8e#zl??#Vg#oTK#jiwI=n^xc~` zq6mFwMz2J`7zH(t1Ei3ORIUoDp$Fj%r-rT}DVzi5FG+wk3TmDK&=B~cOh}EZQI)T9 znXoFTu`0?$R1QvyRLCl(c3qiFQ{lEka(RU$Da!T1(T=e15a<}FnFMeW4#LP00XZiQ z7;-qkuoDA}I09hQ;Q@Ik0w_2kz?c&Sj5}dK(f@bI-sBJxhuR{S6`~Y}EG1jea7ig@ za^v-?`)scMem&^pv+l=bul5-nf^0!6O~{bPH#zP20mDHFY@kP4pGDsuCAElB5#Vo`$x zyp7f7?BgJ-*p`7ObgiJujoA-#l#f5Ck;=PhqF zmp6lf?Xs#^8vg%5cW29cwd2kG70r9O=`9_!AuT27KrkYWcY|mA&m=2@iU$p)Lc4gH z=(!{+v~QIP?dH%3YcSm|9_i@Gyde4LRv&z!r$G86|NBF$MxaMm)Go z0=tC>Tc$Ncj>7AADkYDnbSrOX$Hy*>8LF0q;nVIIWO}$fgM7yw{9A6=4m>=V{8kir3p0UHt*B(zS9HjGKzirNl@HB_?N-NKTlvt3Zf zdK%o2;D9)fBNu)Fza$(HNc@GKc#|1~xZudnL4ilU!OfKnh1SMJAW4g zI(MLoaf}c}1W`;dLsXkV49y^-fpujaY$zLGQ`rRPlyl$_3KT0s~zKGj1j$1NAnkl*d5}hhxxV5x>swsYnzQK$yK~{ui=s0 z)`QAQdapyj+#u$o`(Di>+TF*8R<%~~YHq64T6OCIh!_>GUM70oYY=^9vqH@EwT-m~ zG49o>8^nCLvc3gNWw&~w`QmVHdD&fBa!Vz5spKw~+)E{Q!M*0*aId!;zPR(q-{-@Dt{tc|FOsV;=c3 zvHcEZyeTA4^pJI6#MozjL9DdR!Z`SZ_!vAjyuW&Tdo_@Iy`AmyN;#(N9`_^mBIf%G z-M-w5I}6p?#=k?`?SO@JTO5SVOk%OyPwcMG1#7|)7hz$M{r84}Ej)>fm`^|~v6{`u z4?4|eV#+{&KhfC1pLBE} u*=ahuJm|>mi~QA$XE|GnV%iJYa{6zHo6s1Vp%wmfIkHA%vhhC zED#t^kKX(2Rhf`~aWgzb*et+wW`R&bxjI?rDjY`^3FWD;an)2fJUj`1 z+Des2B2CM7)$VWi!o8m}9ICteitd<03U0MBGM;1FYWMc9op0`kBh04mIA2;eRl|EX zyGJ)NSBP38>`ffaWL%@bKPD0t<#ILZEl&M(1!h z4R&g%+SF}*{rSO;WyVE2W<5XLvCuj3PPCsB@R_N%EHBM$1-o&I{g9N`q zTuflj)8H_*q1S#4y(RqP`%e3>^e~3|nz^C&Z@06@U+8tuRKu-D14h=763-yB(U6kB z{0Rh57f9@K*0(&AyS7?0>vRq-I2cVL7r4#o*vFJ@Fz1mC1C^&`Jq;V59Fb#kod=J( zmm)OYh2zxB7>%*MHXw%vK#U-RKLHSFjn)h|aY)2F6-jfeHD|;l6lNa10Tx6a<&=R( zDf|4K!iqrT7-nw{`w^bpOp~d1_B;Foe&No8)X}l#Ys`2}voTZ|d+kebwg5B9t|avn zpGV9@jM5Zy$r1F=BmS5iM=AC?a8qkC=B~jnY04Y5RIm}#K!Vl@Ed%WuXK;iDs#*kz zaaJP_(h%)jDiyHc5iU&&3YxZVQLm2cqNaWB>GhZ+Lx?N`A~c1sVrQ@~B6$%Bv*cx5 zVHX-ASYs^F@hJy)&`64fONy)%l)NG{-cm^nE@s-*Joco>+nlwsW*RON9a7C+V%4u) OiEMrgTMl!#DEtSQXLVoz diff --git a/CACodeFramework/util/__pycache__/DbUtil.cpython-39.pyc b/CACodeFramework/util/__pycache__/DbUtil.cpython-39.pyc deleted file mode 100644 index 2a028cee94f31dcf080cae384e3899f75f1cb63d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5556 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 Q_5ZhF(bxKy)nT*$0jj|&9smFU diff --git a/CACodeFramework/util/__pycache__/Log.cpython-39.pyc b/CACodeFramework/util/__pycache__/Log.cpython-39.pyc deleted file mode 100644 index f4e01472bd6234d4d7507c23591dfaf637ff13be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3901 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 PN@-529mx34K+FIDs|qJV diff --git a/README.md b/README.md index af5f221..63c2555 100644 --- a/README.md +++ b/README.md @@ -48,9 +48,13 @@ 简历发送至邮箱cacode@163.com,标题 CACodeFramework-姓名-语言 -## 版本更新: +# 逻辑处理流程图 -# 1.1.2.1 +![流程图](./imgs/lct.png "流程图") + +# 版本更新: + +## 1.1.2.1 - 修复多线程下查询报错 - 查询速度显著提高 @@ -60,14 +64,14 @@ - 教程正在录制中。。。 -### 1.1.1.1 +## 1.1.1.1 -- 修复半自动Repository的insert相关解析失败 -- 修复全自动ORM执行失败 -- 新增group_by(*args) -- 新增一个2048小彩蛋 -### 1.1.0.03: +## 1.1.0.03: - 修复JsonUtil.parse(obj) - 部分字典dict解析失败 @@ -76,7 +80,7 @@ - 可以使用:orm.find('title', 'success', asses=['t', None]).end()将索引对应字段转成另一个别名 最后的结果就是:SELECT `title` FROM `demo_table` as t -### 1.1.0.2: +## 1.1.0.2: - 修复find - 无法返回POJO @@ -85,7 +89,7 @@ - 修复PureORM - 修复返回值为dict而非POJO问题 -### 1.0.2.1: +## 1.0.2.1: - 修复JsonUtil - 无法解析对象 diff --git a/delete.py b/delete.py new file mode 100644 index 0000000..e011a2c --- /dev/null +++ b/delete.py @@ -0,0 +1,17 @@ +import os + + +def clear(filepath): + files = os.listdir(filepath) + for fd in files: + cur_path = os.path.join(filepath, fd) + if os.path.isdir(cur_path): + if fd == "__pycache__": + print("rmdir %s " % cur_path) + os.system("rmdir /s/q %s" % cur_path) + else: + clear(cur_path) + + +if __name__ == "__main__": + clear(os.getcwd()) diff --git a/upload.bat b/upload.bat index d2d5706..f3d6de3 100644 --- a/upload.bat +++ b/upload.bat @@ -1,3 +1,4 @@ +python delete.py python setup.py sdist bdist_wheel twine upload dist/* git push origin main -- Gitee From 06d59fddee9ef96c25d16efd488a7696af5b433e Mon Sep 17 00:00:00 2001 From: CACode Date: Sat, 17 Apr 2021 10:35:27 +0800 Subject: [PATCH 04/21] delete many dir --- delete.py | 17 ----------------- pyproject.toml | 6 ------ setup.py | 25 ------------------------- upload.bat | 5 ----- 4 files changed, 53 deletions(-) delete mode 100644 delete.py delete mode 100644 pyproject.toml delete mode 100644 setup.py delete mode 100644 upload.bat diff --git a/delete.py b/delete.py deleted file mode 100644 index e011a2c..0000000 --- a/delete.py +++ /dev/null @@ -1,17 +0,0 @@ -import os - - -def clear(filepath): - files = os.listdir(filepath) - for fd in files: - cur_path = os.path.join(filepath, fd) - if os.path.isdir(cur_path): - if fd == "__pycache__": - print("rmdir %s " % cur_path) - os.system("rmdir /s/q %s" % cur_path) - else: - clear(cur_path) - - -if __name__ == "__main__": - clear(os.getcwd()) diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index b5a3c46..0000000 --- a/pyproject.toml +++ /dev/null @@ -1,6 +0,0 @@ -[build-system] -requires = [ - "setuptools>=42", - "wheel" -] -build-backend = "setuptools.build_meta" \ No newline at end of file diff --git a/setup.py b/setup.py deleted file mode 100644 index e871020..0000000 --- a/setup.py +++ /dev/null @@ -1,25 +0,0 @@ -import setuptools - -with open("README.md", "r", encoding="utf-8") as fh: - long_description = fh.read() - -setuptools.setup( - name="CACodeFramework", # Replace with your own username - version="1.1.2.1", - author="CACode", - author_email="cacode@163.com", - description="CACode Framework For Python Flask,This framework corresponds to the ORM problem,You can see:https://github.com/cctvadmin/CACodeFramework-python-ORM", - long_description=long_description, - long_description_content_type="text/markdown", - url="https://github.com/cctvadmin/CACodeFramework-python-ORM", - project_urls={ - "Bug Tracker": "https://github.com/cctvadmin/CACodeFramework-python-ORM/issues", - }, - classifiers=[ - "Programming Language :: Python :: 3", - "License :: OSI Approved :: MIT License", - "Operating System :: OS Independent", - ], - packages=setuptools.find_packages(), - python_requires=">=3.6", -) diff --git a/upload.bat b/upload.bat deleted file mode 100644 index f3d6de3..0000000 --- a/upload.bat +++ /dev/null @@ -1,5 +0,0 @@ -python delete.py -python setup.py sdist bdist_wheel -twine upload dist/* -git push origin main -git push gitee main \ No newline at end of file -- Gitee From 589a51cd13eb838f7b813ae6b1cd12026d098396 Mon Sep 17 00:00:00 2001 From: CACode Date: Wed, 21 Apr 2021 01:26:13 +0800 Subject: [PATCH 05/21] =?UTF-8?q?'=E6=9C=AC=E6=AC=A1=E6=9C=AA=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E6=9B=B4=E6=96=B0=EF=BC=8C=E4=BB=85=E5=81=9A=E5=A4=87?= =?UTF-8?q?=E4=BB=BD=E5=A4=84=E7=90=86=EF=BC=8C=E4=B8=8B=E4=B8=80=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=B0=86=E6=9B=B4=E6=96=B0=E5=85=A8=E8=A3=85=E9=A5=B0?= =?UTF-8?q?=E5=99=A8=E6=A8=A1=E5=BC=8F'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CACodeFramework/MainWork/Annotations.py | 92 ------- CACodeFramework/MainWork/CACodePojo.py | 124 --------- .../{MainWork/exception => anno}/__init__.py | 0 CACodeFramework/anno/annos.py | 0 CACodeFramework/anno/aop.py | 253 ++++++++++++++++++ CACodeFramework/cache/__init__.py | 0 CACodeFramework/exception/__init__.py | 0 .../{MainWork => }/exception/e_except.py | 0 CACodeFramework/field/field_tag.py | 42 --- CACodeFramework/opera/__init__.py | 0 CACodeFramework/pojoManager/PojoManager.py | 0 CACodeFramework/pojoManager/__init__.py | 0 CACodeFramework/pojoManager/tag.py | 0 13 files changed, 253 insertions(+), 258 deletions(-) delete mode 100644 CACodeFramework/MainWork/Annotations.py delete mode 100644 CACodeFramework/MainWork/CACodePojo.py rename CACodeFramework/{MainWork/exception => anno}/__init__.py (100%) create mode 100644 CACodeFramework/anno/annos.py create mode 100644 CACodeFramework/anno/aop.py create mode 100644 CACodeFramework/cache/__init__.py create mode 100644 CACodeFramework/exception/__init__.py rename CACodeFramework/{MainWork => }/exception/e_except.py (100%) delete mode 100644 CACodeFramework/field/field_tag.py create mode 100644 CACodeFramework/opera/__init__.py create mode 100644 CACodeFramework/pojoManager/PojoManager.py create mode 100644 CACodeFramework/pojoManager/__init__.py create mode 100644 CACodeFramework/pojoManager/tag.py diff --git a/CACodeFramework/MainWork/Annotations.py b/CACodeFramework/MainWork/Annotations.py deleted file mode 100644 index 2f3df4b..0000000 --- a/CACodeFramework/MainWork/Annotations.py +++ /dev/null @@ -1,92 +0,0 @@ -def Table(name, msg, **kwargs): - """ - 标注该类为一个表 - :param name:表的名称 - :param msg:表的描述 - :return: - """ - - def set_to_field(func): - setattr(func, '__table_name__', name) - setattr(func, '__table_msg__', msg) - for key, value in kwargs.items(): - setattr(func, key, value) - return func - - return set_to_field - - -def Operations(): - """ - 标注该类为一个操做 - :return: - """ - - def set_to_field(func): - print('1111111') - return func - - return set_to_field - - -def Before(function): - """ - 切入操做,在执行函数之前切入指定函数 - - 切入: - - 在执行函数之前首先执行指定操做称为切入 - - """ - - def set_to_field(func): - print('1111111') - return func - - return set_to_field - - -def After(function): - """ - 切出操做,在执行函数之前切出指定函数 - - 切出: - - 在指定函数调用完毕时执行得操做成为切除 - """ - - def set_to_field(func): - print('1111111') - return func - - return set_to_field - - -from functools import wraps - - -def decorater(func): - @wraps(func) # 保持原函数名不变 - def wrapper(*args, **kwargs): - print('位置参数:{}'.format(args)) - print('关键字参数:{}'.format(kwargs)) - res = func(*args, **kwargs) - print('装饰器内函数名:%s' % func.__name__) - print('返回值:%s' % res) - print('函数func所属的类:%s' % func.__qualname__) - print('被调用时的行号:', sys._getframe().f_back.f_lineno) - return res - - return wrapper - - -class Name(): - @decorater - def func2(self, *args, **kwargs): - return 'return' - - -if __name__ == '__main__': - a = Name() - a.func2(1, 2, a=3, b=4) - print('装饰外内函数名:%s' % a.func2.__name__) diff --git a/CACodeFramework/MainWork/CACodePojo.py b/CACodeFramework/MainWork/CACodePojo.py deleted file mode 100644 index 032a1ca..0000000 --- a/CACodeFramework/MainWork/CACodePojo.py +++ /dev/null @@ -1,124 +0,0 @@ -from CACodeFramework.MainWork.CACodePureORM import CACodePureORM -from CACodeFramework.field import field_tag -from CACodeFramework.util import JsonUtil -from CACodeFramework.MainWork import CACodeRepository - - -class POJO(CACodeRepository.Repository): - def __init__(self, config_obj=None, log_conf=None, close_log=False, **kwargs): - """ - 初始化ORM框架 - """ - self.__table_name__ = self.__table_name__ - self.__table_msg__ = self.__table_msg__ - self.fields = self.init_fields() - for key, value in kwargs.items(): - self.__setattr__(key, value) - super(POJO, self).__init__(config_obj=config_obj, - participants=self, - log_conf=log_conf, - close_log=close_log) - - def init_fields(self): - """ - 初始化字段 - """ - fields = self.__dict__ - fds = {} - for key, value in fields.items(): - # 取出这个值引用对象的父类 - try: - t_v = value.__class__.__bases__ - t_bf = field_tag.baseTag - if t_v[0] == t_bf: - fds[key] = value - except SyntaxError: - continue - return fds - - def to_json(self): - """ - 将此对象转换为json - - 无视时间报错 - """ - return JsonUtil.parse(self) - - def to_dict(self): - """ - 将此对象转换成字典格式 - """ - return self.fields - - def eq_default(self, val): - """ - 是否等于默认值 - """ - try: - t_v = val.__class__.__bases__ - t_bf = field_tag.baseTag - return t_v[0] == t_bf - except SyntaxError: - return False - - @property - def orm(self): - """ - 转ORM框架 - """ - return CACodePureORM(self) - - -class tinyintField(field_tag.baseTag): - def __init__(self, **kwargs): - super(tinyintField, self).__init__(**kwargs) - - -class intField(field_tag.baseTag): - def __init__(self, **kwargs): - super(intField, self).__init__(**kwargs) - - -class bigintField(field_tag.baseTag): - def __init__(self, **kwargs): - super(bigintField, self).__init__(**kwargs) - - -class floatField(field_tag.baseTag): - def __init__(self, **kwargs): - super(floatField, self).__init__(**kwargs) - - -class doubleField(field_tag.baseTag): - def __init__(self, **kwargs): - super(doubleField, self).__init__(**kwargs) - - -class datetimeField(field_tag.baseTag): - def __init__(self, **kwargs): - super(datetimeField, self).__init__(**kwargs) - - -class charField(field_tag.baseTag): - def __init__(self, **kwargs): - super(charField, self).__init__(**kwargs) - - -class varcharField(field_tag.baseTag): - def __init__(self, **kwargs): - super(varcharField, self).__init__(**kwargs) - - -class textField(field_tag.baseTag): - def __init__(self, **kwargs): - super(textField, self).__init__(**kwargs) - - -class tinytextField(field_tag.baseTag): - def __init__(self, **kwargs): - super(tinytextField, self).__init__(**kwargs) - - -class longtextField(field_tag.baseTag): - def __init__(self, **kwargs): - super(longtextField, self).__init__(**kwargs) diff --git a/CACodeFramework/MainWork/exception/__init__.py b/CACodeFramework/anno/__init__.py similarity index 100% rename from CACodeFramework/MainWork/exception/__init__.py rename to CACodeFramework/anno/__init__.py diff --git a/CACodeFramework/anno/annos.py b/CACodeFramework/anno/annos.py new file mode 100644 index 0000000..e69de29 diff --git a/CACodeFramework/anno/aop.py b/CACodeFramework/anno/aop.py new file mode 100644 index 0000000..a3ecc64 --- /dev/null +++ b/CACodeFramework/anno/aop.py @@ -0,0 +1,253 @@ +import types +from functools import wraps + + +class AopModel: + """AOP面向切面编程 + + 面向切面的程序设计将代码逻辑切分为不同的模块(即关注点(Concern),一段特定的逻辑功能)。几乎所有的编程思想都涉及代码功能的分类, + + 将各个关注点封装成独立的抽象模块(如函数、过程、模块、类以及方法等),后者又可供进一步实现、封装和重写。部分关注点“横切”程序代码中的数个模块, + + 即在多个模块中都有出现,它们即被称作横切关注点(Cross-cutting concerns, Horizontal concerns)。 + + + + Attributes: + + before:切入时需要执行的函数 + + after:切出前需要执行的参数 + + before_args:切入的参数 + 传入的列表或元组类型数据 + 如果是需要使用当前pojo中的内容时,传参格式为:(pojo.字段名) + 可扩展格式,例如需要传入字典 + + before_kwargs:切入的参数 -- 传入的字典数据 + + after_args:切出的参数 + 传入的列表或元组类型数据 + 如果是需要使用当前pojo中的内容时,传参格式为:('self.字段名') + 可扩展格式,例如需要传入字典:('self.dict.key') + + after_kwargs:切出的参数 -- 传入的字典数据 + + + """ + + def __init__(self, func, before=None, after=None, before_args=None, before_kwargs=None, after_args=None, + after_kwargs=None): + wraps(func)(self) + self.func = func + + # 定义名称规则 + self.after = 'after' + self.after_args = 'after_args' + self.after_kwargs = 'after_kwargs' + + self.before = 'before' + self.before_args = 'before_args' + self.before_kwargs = 'before_kwargs' + + self.__after__ = '__after_func__' + self.__after_args__ = '__after_args__' + self.__after_kwargs__ = '__after_kwargs__' + + # 得到before参数的名称 + self.__before_name__ = self.format_name(self.before) + self.__before_args_name__ = self.format_name(self.before_args) + self.__before_kwargs_name__ = self.format_name(self.before_kwargs) + + # 得到after参数的名称 + + self.__after_name__ = self.format_name(self.__after__) + self.__after_args_name__ = self.format_name(self.__after_args__) + self.__after_kwargs_name__ = self.format_name(self.__after_kwargs__) + + def __call__(self, *args, **kwargs): + """ + 主操作 + """ + # 初始化attr字段参数 + self.init_attr(*args, **kwargs) + # 解析参数需要 + self.before_parse() + # 执行before操作 + self.before_run() + # 执行原始数据 + result = self.original_func() + # after解析 + self.after_parse() + # after操作 + self.after_run() + # 返回原始数据 + return result + + def __get__(self, instance, cls): + if instance is None: + return self + else: + return types.MethodType(self, instance) + + def format_name(self, name): + """ + 格式化名称字符串 + """ + return '{}{}'.format(name, self.func.__name__) + + def setters(self, i1, i2, i3, k1, v1, k2, v2, k3, v3): + """ + 批量设置 + """ + if i1 in self.kwargs.keys(): + setattr(self.cls, v1, self.kwargs[k1]) + if i2 in self.kwargs.keys(): + setattr(self.cls, v2, self.kwargs[k2]) + if i3 in self.kwargs.keys(): + setattr(self.cls, v3, self.kwargs[k3]) + + def init_attr(self, *args, **kwargs): + """ + 初始化cls下的字段 + 通过使用setters下的setter()功能批量解析是否需要before或者after操作 + """ + + # 将这参数移送到全局 + self.args = args + # 这是方法前面的self参数。表示为该方法所对应的字段 + self.cls = args[0] + self.kwargs = kwargs + + self.setters( + i1=self.before, + i2=self.before_args, + i3=self.before_kwargs, + k1=self.before, + k2=self.before_args, + k3=self.before_kwargs, + v3=self.__before_kwargs_name__, + v1=self.__before_name__, + v2=self.__before_args_name__, + ) + + self.setters( + i1=self.after, + i2=self.after_args, + i3=self.after_kwargs, + k1=self.after, + k2=self.after_args, + k3=self.after_kwargs, + v1=self.__after_name__, + v2=self.__after_args_name__, + v3=self.__after_kwargs_name__ + ) + + def before_parse(self): + """ + 解析before参数的方法需要什么参数类型 + """ + __before_func__ = None + __before_args_data__ = None + __before_kwargs_data__ = None + # 如果包含切入函数的字段 + if hasattr(self.cls, self.__before_name__): + # 得到参数的名称 + __before_func__ = getattr(self.cls, self.__before_name__) + if hasattr(self.cls, self.__before_args_name__) and hasattr(self.cls, self.__before_kwargs_name__): + + __before_args_data__ = getattr(self.cls, self.__before_args_name__) + __before_kwargs_data__ = getattr(self.cls, self.__before_kwargs_name__) + + elif hasattr(self.cls, self.__before_args_name__): + __before_args_data__ = getattr(self.cls, self.__before_args_name__) + + elif hasattr(self.cls, self.__before_kwargs_name__): + __before_kwargs_data__ = getattr(self.cls, self.__before_kwargs_name__) + + # 批添加方法、参数和键值对 + self.__before_func__ = __before_func__ + self.__before_args_data__ = __before_args_data__ + self.__before_kwargs_data__ = __before_kwargs_data__ + + def before_run(self): + """ + 执行before方法 + """ + if self.__before_func__ and self.__before_args_data__ and self.__before_kwargs_data__: + self.__before_func__(*self.__before_args_data__, **self.__before_kwargs_data__) + elif self.__before_func__ and self.__before_args_data__: + self.__before_func__(*self.__before_args_data__) + elif self.__before_func__ and self.__before_kwargs_data__: + self.__before_func__(**self.__before_kwargs_data__) + elif self.__before_func__: + self.__before_func__() + else: + pass + + def after_parse(self): + """ + 解析追加方法 + """ + __after_func__ = None + __after_args_data__ = None + __after_kwargs_data__ = None + # 如果包含切入函数的字段 + if hasattr(self.cls, self.__after_name__): + # 得到参数的名称 + __after_func__ = getattr(self.cls, self.__after_name__) + if hasattr(self.cls, self.__after_args_name__) and hasattr(self.cls, self.__after_kwargs_name__): + + __after_args_data__ = getattr(self.cls, self.__after_args_name__) + __after_kwargs_data__ = getattr(self.cls, self.__after_kwargs_name__) + + elif hasattr(self.cls, self.__after_args_name__): + __after_args_data__ = getattr(self.cls, self.__after_args_name__) + + elif hasattr(self.cls, self.__after_kwargs_name__): + __after_kwargs_data__ = getattr(self.cls, self.__after_kwargs_name__) + + # 批添加方法、参数和键值对 + self.__after_func__ = __after_func__ + self.__after_args_data__ = __after_args_data__ + self.__after_kwargs_data__ = __after_kwargs_data__ + + def after_run(self): + """ + 执行after方法 + """ + if self.__after_func__ and self.__after_args_data__ and self.__after_kwargs_data__: + self.__after_func__(*self.__after_args_data__, **self.__after_kwargs_data__) + elif self.__after_func__ and self.__after_args_data__: + self.__after_func__(*self.__after_args_data__) + elif self.__after_func__ and self.__after_kwargs_data__: + self.__after_func__(**self.__after_kwargs_data__) + elif self.__after_func__: + self.__after_func__() + else: + pass + + def original_func(self): + """ + 最后耍无赖方法返回函数执行的结果 + 使用四个try逐一抛出 + """ + try: + return self.__wrapped__(*self.args, **self.kwargs) + except TypeError as e: + pass + + try: + return self.__wrapped__(*self.args) + except TypeError as e: + pass + + try: + return self.__wrapped__(**self.kwargs) + except TypeError as e: + pass + + try: + return self.__wrapped__() + except TypeError as e: + pass diff --git a/CACodeFramework/cache/__init__.py b/CACodeFramework/cache/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/CACodeFramework/exception/__init__.py b/CACodeFramework/exception/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/CACodeFramework/MainWork/exception/e_except.py b/CACodeFramework/exception/e_except.py similarity index 100% rename from CACodeFramework/MainWork/exception/e_except.py rename to CACodeFramework/exception/e_except.py diff --git a/CACodeFramework/field/field_tag.py b/CACodeFramework/field/field_tag.py deleted file mode 100644 index 2b51075..0000000 --- a/CACodeFramework/field/field_tag.py +++ /dev/null @@ -1,42 +0,0 @@ -class baseTag(object): - def __init__(self, table_name=None, - name=None, - length=None, - d_point=None, - t_type='varchar', - is_null=False, - primary_key=False, - comment="", - auto_field=False, - auto_time=False, - update_auto_time=False): - """ - :param table_name:表名称 - :param name:字段名 - :param length:长度 - :param d_point:小数点 - :param t_type:类型 - :param is_null:允许为空 - :param primary_key:键 - :param comment:注释 - :param auto_field:自增长键 - :param auto_time:默认设置当前时间 - :param update_auto_time:默认设置当前时间并根据当前时间更新 - """ - self.update_auto_time = update_auto_time - self.auto_time = auto_time - self.autoField = auto_field - self.table_name = table_name - self.comment = comment - self.primary_key = primary_key - self.is_null = is_null - self.d_point = d_point - self.name = name - self.t_type = t_type - self.length = length - - def get_table(self): - """ - 获取表数据结构 - """ - return self.__dict__ diff --git a/CACodeFramework/opera/__init__.py b/CACodeFramework/opera/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/CACodeFramework/pojoManager/PojoManager.py b/CACodeFramework/pojoManager/PojoManager.py new file mode 100644 index 0000000..e69de29 diff --git a/CACodeFramework/pojoManager/__init__.py b/CACodeFramework/pojoManager/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/CACodeFramework/pojoManager/tag.py b/CACodeFramework/pojoManager/tag.py new file mode 100644 index 0000000..e69de29 -- Gitee From feefe2afa7139390783b719b0b2434a7713933a4 Mon Sep 17 00:00:00 2001 From: CACode Date: Wed, 21 Apr 2021 04:35:39 +0800 Subject: [PATCH 06/21] [202104210438]... [202104210438]... --- .gitignore | 2 +- CACodeFramework/MainWork/opera/obj_dict.py | 2 +- CACodeFramework/anno/annos.py | 58 ++++ CACodeFramework/anno/aop.py | 348 +++++++++++++-------- CACodeFramework/field/e_fields.py | 7 +- CACodeFramework/pojoManager/PojoManager.py | 82 +++++ CACodeFramework/pojoManager/tag.py | 226 +++++++++++++ CACodeFramework/util/DbUtil.py | 2 +- CACodeFramework/util/Log.py | 2 +- test/test.py | 62 +++- 10 files changed, 648 insertions(+), 143 deletions(-) diff --git a/.gitignore b/.gitignore index 4d2e040..a83f793 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,4 @@ setup.py upload.bat pyproject.toml delete.py - +*.pyc \ No newline at end of file diff --git a/CACodeFramework/MainWork/opera/obj_dict.py b/CACodeFramework/MainWork/opera/obj_dict.py index 5d00ca8..ac6c20c 100644 --- a/CACodeFramework/MainWork/opera/obj_dict.py +++ b/CACodeFramework/MainWork/opera/obj_dict.py @@ -1,7 +1,7 @@ import copy import sys -from CACodeFramework.MainWork.exception import e_except +from CACodeFramework.exception import e_except from CACodeFramework.field import e_fields from CACodeFramework.util.ParseUtil import ParseUtil diff --git a/CACodeFramework/anno/annos.py b/CACodeFramework/anno/annos.py index e69de29..6b1cbcf 100644 --- a/CACodeFramework/anno/annos.py +++ b/CACodeFramework/anno/annos.py @@ -0,0 +1,58 @@ +import types +from functools import wraps + + +def Table(name, msg, **kwargs): + """ + 标注该类为一个表 + :param name:表的名称 + :param msg:表的描述 + :return: + """ + + def set_to_field(cls): + setattr(cls, '__table_name__', name) + setattr(cls, '__table_msg__', msg) + for key, value in kwargs.items(): + setattr(cls, key, value) + return cls + + return set_to_field + + +def Operations(): + """ + 标注该类为一个操做 + :return: + """ + + def set_to_field(func): + print('1111111') + return func + + return set_to_field + + +def Select(): + def base_func(cls): + cls_obj = cls() + structured = cls_obj.__dict__ + args = [] + kwargs = {} + if 'fields' in structured.keys(): + args.append(structured['fields']) + + for key, value in structured.items(): + if key is not 'fields': + kwargs[key] = value + + def _wrapper_(*args, **kwargs): + obj = cls_obj.meta() + + result = obj.orm.find(*args, **kwargs).end() + + return result + + return _wrapper_ + + return base_func diff --git a/CACodeFramework/anno/aop.py b/CACodeFramework/anno/aop.py index a3ecc64..bb1d289 100644 --- a/CACodeFramework/anno/aop.py +++ b/CACodeFramework/anno/aop.py @@ -1,46 +1,56 @@ import types -from functools import wraps -class AopModel: - """AOP面向切面编程 +class AopModel_Object(object): + """ + 此类为AopModel提供所有操作 + """ - 面向切面的程序设计将代码逻辑切分为不同的模块(即关注点(Concern),一段特定的逻辑功能)。几乎所有的编程思想都涉及代码功能的分类, + def __init__(self, before=None, after=None, + before_args=None, before_kwargs=None, + after_args=None, after_kwargs=None): + # wraps(func)(self) + # self.func = func + # 初始化所有字段 + self.__before_func__ = before + self.__before_args_data__ = before_args + self.__before_kwargs_data__ = before_kwargs - 将各个关注点封装成独立的抽象模块(如函数、过程、模块、类以及方法等),后者又可供进一步实现、封装和重写。部分关注点“横切”程序代码中的数个模块, + self.__after_func__ = after + self.__after_args_data__ = after_args + self.__after_kwargs_data__ = after_kwargs - 即在多个模块中都有出现,它们即被称作横切关注点(Cross-cutting concerns, Horizontal concerns)。 - - - - Attributes: - - before:切入时需要执行的函数 - - after:切出前需要执行的参数 - - before_args:切入的参数 - 传入的列表或元组类型数据 - 如果是需要使用当前pojo中的内容时,传参格式为:(pojo.字段名) - 可扩展格式,例如需要传入字典 - - before_kwargs:切入的参数 -- 传入的字典数据 - - after_args:切出的参数 - 传入的列表或元组类型数据 - 如果是需要使用当前pojo中的内容时,传参格式为:('self.字段名') - 可扩展格式,例如需要传入字典:('self.dict.key') - - after_kwargs:切出的参数 -- 传入的字典数据 + def set_func(self, func): + self.func = func + def set_args(self, *args, **kwargs): + self.args = args + self.kwargs = kwargs + def start(self): + """ + 主操作 """ - def __init__(self, func, before=None, after=None, before_args=None, before_kwargs=None, after_args=None, - after_kwargs=None): - wraps(func)(self) - self.func = func + # self.func = args[0] + self.init_fields() + # wraps(self.func)(self) + self.init_attr() + + # 解析参数需要 + # self.before_parse() + # 执行before操作 + self.before_run() + # 执行原始数据 + result = self.original_func() + # after解析 + # self.after_parse(result) + # after操作 + self.after_run(result) + # 返回原始数据 + return result + def init_fields(self): # 定义名称规则 self.after = 'after' self.after_args = 'after_args' @@ -65,25 +75,6 @@ class AopModel: self.__after_args_name__ = self.format_name(self.__after_args__) self.__after_kwargs_name__ = self.format_name(self.__after_kwargs__) - def __call__(self, *args, **kwargs): - """ - 主操作 - """ - # 初始化attr字段参数 - self.init_attr(*args, **kwargs) - # 解析参数需要 - self.before_parse() - # 执行before操作 - self.before_run() - # 执行原始数据 - result = self.original_func() - # after解析 - self.after_parse() - # after操作 - self.after_run() - # 返回原始数据 - return result - def __get__(self, instance, cls): if instance is None: return self @@ -100,25 +91,19 @@ class AopModel: """ 批量设置 """ - if i1 in self.kwargs.keys(): - setattr(self.cls, v1, self.kwargs[k1]) - if i2 in self.kwargs.keys(): - setattr(self.cls, v2, self.kwargs[k2]) - if i3 in self.kwargs.keys(): - setattr(self.cls, v3, self.kwargs[k3]) - - def init_attr(self, *args, **kwargs): + if i1 in self.__dict__.keys(): + setattr(self, v1, self.__dict__[k1]) + if i2 in self.__dict__.keys(): + setattr(self, v2, self.__dict__[k2]) + if i3 in self.__dict__.keys(): + setattr(self, v3, self.__dict__[k3]) + + def init_attr(self): """ 初始化cls下的字段 通过使用setters下的setter()功能批量解析是否需要before或者after操作 """ - # 将这参数移送到全局 - self.args = args - # 这是方法前面的self参数。表示为该方法所对应的字段 - self.cls = args[0] - self.kwargs = kwargs - self.setters( i1=self.before, i2=self.before_args, @@ -143,32 +128,32 @@ class AopModel: v3=self.__after_kwargs_name__ ) - def before_parse(self): - """ - 解析before参数的方法需要什么参数类型 - """ - __before_func__ = None - __before_args_data__ = None - __before_kwargs_data__ = None - # 如果包含切入函数的字段 - if hasattr(self.cls, self.__before_name__): - # 得到参数的名称 - __before_func__ = getattr(self.cls, self.__before_name__) - if hasattr(self.cls, self.__before_args_name__) and hasattr(self.cls, self.__before_kwargs_name__): - - __before_args_data__ = getattr(self.cls, self.__before_args_name__) - __before_kwargs_data__ = getattr(self.cls, self.__before_kwargs_name__) - - elif hasattr(self.cls, self.__before_args_name__): - __before_args_data__ = getattr(self.cls, self.__before_args_name__) - - elif hasattr(self.cls, self.__before_kwargs_name__): - __before_kwargs_data__ = getattr(self.cls, self.__before_kwargs_name__) - - # 批添加方法、参数和键值对 - self.__before_func__ = __before_func__ - self.__before_args_data__ = __before_args_data__ - self.__before_kwargs_data__ = __before_kwargs_data__ + # def before_parse(self): + # """ + # 解析before参数的方法需要什么参数类型 + # """ + # __before_func__ = None + # __before_args_data__ = None + # __before_kwargs_data__ = None + # # 如果包含切入函数的字段 + # if hasattr(self, self.__before_name__): + # # 得到参数的名称 + # __before_func__ = getattr(self, self.__before_name__) + # if hasattr(self, self.__before_args_name__) and hasattr(self, self.__before_kwargs_name__): + # + # __before_args_data__ = getattr(self, self.__before_args_name__) + # __before_kwargs_data__ = getattr(self, self.__before_kwargs_name__) + # + # elif hasattr(self, self.__before_args_name__): + # __before_args_data__ = getattr(self, self.__before_args_name__) + # + # elif hasattr(self, self.__before_kwargs_name__): + # __before_kwargs_data__ = getattr(self, self.__before_kwargs_name__) + # + # # 批添加方法、参数和键值对 + # self.__before_func__ = __before_func__ + # self.__before_args_data__ = __before_args_data__ + # self.__before_kwargs_data__ = __before_kwargs_data__ def before_run(self): """ @@ -185,37 +170,43 @@ class AopModel: else: pass - def after_parse(self): - """ - 解析追加方法 - """ - __after_func__ = None - __after_args_data__ = None - __after_kwargs_data__ = None - # 如果包含切入函数的字段 - if hasattr(self.cls, self.__after_name__): - # 得到参数的名称 - __after_func__ = getattr(self.cls, self.__after_name__) - if hasattr(self.cls, self.__after_args_name__) and hasattr(self.cls, self.__after_kwargs_name__): - - __after_args_data__ = getattr(self.cls, self.__after_args_name__) - __after_kwargs_data__ = getattr(self.cls, self.__after_kwargs_name__) - - elif hasattr(self.cls, self.__after_args_name__): - __after_args_data__ = getattr(self.cls, self.__after_args_name__) - - elif hasattr(self.cls, self.__after_kwargs_name__): - __after_kwargs_data__ = getattr(self.cls, self.__after_kwargs_name__) - - # 批添加方法、参数和键值对 - self.__after_func__ = __after_func__ - self.__after_args_data__ = __after_args_data__ - self.__after_kwargs_data__ = __after_kwargs_data__ - - def after_run(self): + # def after_parse(self, result): + # """ + # 解析追加方法 + # :param result:原始方法返回的值 + # """ + # __after_func__ = None + # __after_args_data__ = None + # __after_kwargs_data__ = {} + # # 如果包含切入函数的字段 + # if hasattr(self, self.__after_name__): + # # 得到参数的名称 + # __after_func__ = getattr(self, self.__after_name__) + # if hasattr(self, self.__after_args_name__) and hasattr(self, self.__after_kwargs_name__): + # + # __after_args_data__ = getattr(self, self.__after_args_name__) + # __after_kwargs_data__ = getattr(self, self.__after_kwargs_name__) + # + # elif hasattr(self, self.__after_args_name__): + # __after_args_data__ = getattr(self, self.__after_args_name__) + # + # elif hasattr(self, self.__after_kwargs_name__): + # __after_kwargs_data__ = getattr(self, self.__after_kwargs_name__) + # + # # 批添加方法、参数和键值对 + # self.__after_func__ = __after_func__ + # self.__after_args_data__ = __after_args_data__ + # __after_kwargs_data__.update({'result': result}) + # self.__after_kwargs_data__ = __after_kwargs_data__ + + def after_run(self, result): """ 执行after方法 """ + if self.__after_kwargs_data__ is None: + self.__after_kwargs_data__ = {} + + self.__after_kwargs_data__.update({'result': result}) if self.__after_func__ and self.__after_args_data__ and self.__after_kwargs_data__: self.__after_func__(*self.__after_args_data__, **self.__after_kwargs_data__) elif self.__after_func__ and self.__after_args_data__: @@ -233,21 +224,132 @@ class AopModel: 使用四个try逐一抛出 """ try: - return self.__wrapped__(*self.args, **self.kwargs) + return self.func(*self.args, **self.kwargs) except TypeError as e: pass try: - return self.__wrapped__(*self.args) + return self.func(*self.args) except TypeError as e: pass try: - return self.__wrapped__(**self.kwargs) + return self.func(**self.kwargs) except TypeError as e: pass try: - return self.__wrapped__() + return self.func() except TypeError as e: pass + + +def AopModel(before=None, after=None, + before_args=None, before_kwargs=None, + after_args=None, after_kwargs=None): + """ + + AOP切面模式: + 依赖AopModel装饰器,再在方法上加入@AopModel即可切入编程 + + + 优点: + + 当使用@AopModel时,内部函数将会逐级调用回调函数,执行循序是: + - func(*self.args, **self.kwargs) + - func(*self.args) + - func(**self.kwargs) + - func() + 这将意味着,如果你的参数传入错误时,AopModel依旧会遵循原始方法所使用的规则,最令人大跌眼镜的使用方法就是: + + def Before(**kwargs): + print('Before:', kwargs) + # 此处的Before方法未存在args参数,而使用@AopModel时却传入了args + @AopModel(before=Before,before_args=(0,1,2), before_kwargs={'1': '1'}) + def find_title_and_selects(self, **kwargs): + + print('function task', kwargs['uid']) + + _r = self.orm.find().where(index="<<100").end() + + print(_r) + + return _r + + 其中包含参数有: + before:切入时需要执行的函数 + + before_args:切入的参数 + 传入的列表或元组类型数据 + 如果是需要使用当前pojo中的内容时,传参格式为:(pojo.字段名) + 可扩展格式,例如需要传入字典 + + before_kwargs:切入的参数 -- 传入的字典数据 + + after:切出前需要执行的参数 + + after_args:切出的参数 + 传入的列表或元组类型数据 + 如果是需要使用当前pojo中的内容时,传参格式为:('self.字段名') + 可扩展格式,例如需要传入字典:('self.dict.key') + + after_kwargs:切出的参数 -- 传入的字典数据 + + + 执行流程: + + Before->original->After + + Before注意事项: + + 使用该参数时,方法具有返回值概不做处理,需要返回值内容可使用`global`定义一个全局字段用于保存数值 + + 当无法解析或者解析失败时m将使用pass关键字忽略操作 + + After注意事项: + + 使用该参数时,必须搭配至少一个result=None的kwargs存在于方法的形参中, + + 当original方法执行完成将把返回值固定使用result键值对注入到该函数中 + + 当无法解析或者解析失败时m将使用pass关键字忽略操作 + + + + Attributes: + + before:切入时需要执行的函数 + + after:切出前需要执行的参数 + + before_args:切入的参数 + 传入的列表或元组类型数据 + 如果是需要使用当前pojo中的内容时,传参格式为:(pojo.字段名) + 可扩展格式,例如需要传入字典 + + before_kwargs:切入的参数 -- 传入的字典数据 + + after_args:切出的参数 + 传入的列表或元组类型数据 + 如果是需要使用当前pojo中的内容时,传参格式为:('self.字段名') + 可扩展格式,例如需要传入字典:('self.dict.key') + + after_kwargs:切出的参数 -- 传入的字典数据 + + + """ + # 得到对象组 + aop_obj = AopModel_Object(before, after, + before_args, before_kwargs, + after_args, after_kwargs) + + def base_func(func): + aop_obj.set_func(func) + + def _wrapper_(*args, **kwargs): + aop_obj.set_args(*args, **kwargs) + return aop_obj.start() + + return _wrapper_ + + return base_func diff --git a/CACodeFramework/field/e_fields.py b/CACodeFramework/field/e_fields.py index 75669c8..1d1b89f 100644 --- a/CACodeFramework/field/e_fields.py +++ b/CACodeFramework/field/e_fields.py @@ -1,7 +1,8 @@ -JSON_ERROR = 'CACode-J' -SYNTAX_ERROR = 'CACode-S' -ATTR_ERROR = 'CACode-A' +JSON_ERROR = 'CACode-Json' +SYNTAX_ERROR = 'CACode-Syntax' +ATTR_ERROR = 'CACode-Attr' LOG_OPERA_NAME = 'CACode-Database-Operation' WARN = 'WARN' INFO = 'INFO' DB_TASK = 'DATABASE OPERATION' +PARSE_ERROR = 'CACode-Parse' diff --git a/CACodeFramework/pojoManager/PojoManager.py b/CACodeFramework/pojoManager/PojoManager.py index e69de29..2bb4e37 100644 --- a/CACodeFramework/pojoManager/PojoManager.py +++ b/CACodeFramework/pojoManager/PojoManager.py @@ -0,0 +1,82 @@ +from CACodeFramework.MainWork.CACodePureORM import CACodePureORM +from CACodeFramework.pojoManager import tag +from CACodeFramework.util import JsonUtil +from CACodeFramework.MainWork import CACodeRepository +from abc import ABCMeta, abstractmethod + + +class pojo(CACodeRepository.Repository): + def __init__(self, config_obj=None, log_conf=None, close_log=False, **kwargs): + """ + 初始化ORM框架 + """ + self.__table_name__ = self.__table_name__ + self.__table_msg__ = self.__table_msg__ + self.fields = self.init_fields() + for key, value in kwargs.items(): + self.__setattr__(key, value) + super(pojo, self).__init__(config_obj=config_obj, + participants=self, + log_conf=log_conf, + close_log=close_log) + + def init_fields(self): + """ + 初始化字段 + """ + fields = self.__dict__ + fds = {} + for key, value in fields.items(): + # 取出这个值引用对象的父类 + try: + t_v = value.__class__.__bases__ + t_bf = tag.baseTag + if t_v[0] == t_bf: + fds[key] = value + except SyntaxError: + continue + return fds + + def to_json(self): + """ + 将此对象转换为json + + 无视时间报错 + """ + return JsonUtil.parse(self) + + def to_dict(self): + """ + 将此对象转换成字典格式 + """ + return self.fields + + def eq_default(self, val): + """ + 是否等于默认值 + """ + try: + t_v = val.__class__.__bases__ + t_bf = tag.baseTag + return t_v[len(t_v) - 1] == t_bf + except SyntaxError: + return False + + @property + def orm(self): + """ + 转ORM框架 + """ + return CACodePureORM(self) + + +class Operation(metaclass=ABCMeta): + def __int__(self): + pass + + @abstractmethod + def meta(self): + pass + + def run(self): + self.run_operation() diff --git a/CACodeFramework/pojoManager/tag.py b/CACodeFramework/pojoManager/tag.py index e69de29..6312035 100644 --- a/CACodeFramework/pojoManager/tag.py +++ b/CACodeFramework/pojoManager/tag.py @@ -0,0 +1,226 @@ +from CACodeFramework.util import JsonUtil + +""" +这个文件用来为pojo对象做标记,当对象为空或为以下任意类型时 +insert操做将会忽略该字段,find操作不会处理为空的字段 +""" + + +class baseTag(object): + def __init__(self, + table_name=None, + name=None, + length=None, + d_point=None, + t_type='varchar', + is_null=False, + primary_key=False, + comment="", + auto_field=False, + auto_time=False, + update_auto_time=False): + """ + :param table_name:表名称 + :param name:字段名 + :param length:长度 + :param d_point:小数点 + :param t_type:类型 + :param is_null:允许为空 + :param primary_key:键 + :param comment:注释 + :param auto_field:自增长键 + :param auto_time:默认设置当前时间 + :param update_auto_time:默认设置当前时间并根据当前时间更新 + """ + self.update_auto_time = update_auto_time + self.auto_time = auto_time + self.autoField = auto_field + self.table_name = table_name + self.comment = comment + self.primary_key = primary_key + self.is_null = is_null + self.d_point = d_point + self.name = name + self.t_type = t_type + self.length = length + # 如果使用的是被继承的子类,那么在这里就会有一个名为fields的字段 + # 将所有自定义字段 + if self.fields: + for key, value in self.fields.items(): + setattr(self, key, value) + + del self.fields + + def get_field(self, name): + """ + 获得字段 + """ + return getattr(self, name) + + def set_field(self, name, value): + """ + 设置值 + """ + setattr(self, name, value) + + def get_table(self, bf): + """ + 获取表数据结构 + """ + if bf: + return JsonUtil.parse(self, bf) + return JsonUtil.load(JsonUtil.parse(self)) + + +class tinyintField(baseTag): + + def __init__(self, cls=None, **kwargs): + self.fields = {} + if cls: + kwargs.update(cls.__dict__) + self.fields['cls'] = cls + kwargs.update(update_field(**kwargs)) + self.fields.update(kwargs) + super(tinyintField, self).__init__(**kwargs) + + +class intField(baseTag): + def __init__(self, cls=None, **kwargs): + self.fields = {} + if cls: + kwargs.update(cls.__dict__) + self.fields['cls'] = cls + kwargs.update(update_field(**kwargs)) + self.fields.update(kwargs) + super(intField, self).__init__(**kwargs) + + +class bigintField(baseTag): + def __init__(self, cls=None, **kwargs): + self.fields = {} + if cls: + kwargs.update(cls.__dict__) + self.fields['cls'] = cls + kwargs.update(update_field(**kwargs)) + self.fields.update(kwargs) + super(bigintField, self).__init__(**kwargs) + + +class floatField(baseTag): + def __init__(self, cls=None, **kwargs): + self.fields = {} + if cls: + kwargs.update(cls.__dict__) + self.fields['cls'] = cls + kwargs.update(update_field(**kwargs)) + self.fields.update(kwargs) + super(floatField, self).__init__(**kwargs) + + +class doubleField(baseTag): + def __init__(self, cls=None, **kwargs): + self.fields = {} + if cls: + kwargs.update(cls.__dict__) + self.fields['cls'] = cls + kwargs.update(update_field(**kwargs)) + self.fields.update(kwargs) + super(doubleField, self).__init__(**kwargs) + + +class datetimeField(baseTag): + def __init__(self, cls=None, **kwargs): + self.fields = {} + if cls: + kwargs.update(cls.__dict__) + self.fields['cls'] = cls + kwargs.update(update_field(**kwargs)) + self.fields.update(kwargs) + super(datetimeField, self).__init__(**kwargs) + + +class charField(baseTag): + def __init__(self, cls=None, **kwargs): + self.fields = {} + if cls: + kwargs.update(cls.__dict__) + self.fields['cls'] = cls + kwargs.update(update_field(**kwargs)) + self.fields.update(kwargs) + super(charField, self).__init__(**kwargs) + + +class varcharField(baseTag): + def __init__(self, cls=None, **kwargs): + self.fields = {} + if cls: + kwargs.update(cls.__dict__) + self.fields['cls'] = cls + kwargs.update(update_field(**kwargs)) + self.fields.update(kwargs) + super(varcharField, self).__init__(**kwargs) + + +class textField(baseTag): + def __init__(self, cls=None, **kwargs): + self.fields = {} + if cls: + kwargs.update(cls.__dict__) + self.fields['cls'] = cls + kwargs.update(update_field(**kwargs)) + self.fields.update(kwargs) + super(textField, self).__init__(**kwargs) + + +class tinytextField(baseTag): + def __init__(self, cls=None, **kwargs): + self.fields = {} + if cls: + kwargs.update(cls.__dict__) + self.fields['cls'] = cls + kwargs.update(update_field(**kwargs)) + self.fields.update(kwargs) + super(tinytextField, self).__init__(**kwargs) + + +class longtextField(baseTag): + def __init__(self, cls=None, **kwargs): + self.fields = {} + if cls: + kwargs.update(cls.__dict__) + self.fields['cls'] = cls + kwargs.update(update_field(**kwargs)) + self.fields.update(kwargs) + super(longtextField, self).__init__(**kwargs) + + +def update_field(**kwargs): + """ + 更新字典配置 + """ + + def no_rep(key, value, **kwargs): + """ + 不存在则替换 + """ + if key not in kwargs.keys(): + kwargs[key] = value + return kwargs + + def has_attr(key, **kwargs): + if key in kwargs: + return kwargs[key] + return None + + kwargs.update(no_rep('table_name', has_attr('__table_name__', **kwargs), **kwargs)) + kwargs.update(no_rep('name', has_attr('name', **kwargs), **kwargs)) + kwargs.update(no_rep('length', has_attr('length', **kwargs), **kwargs)) + kwargs.update(no_rep('d_point', has_attr('d_point', **kwargs), **kwargs)) + kwargs.update(no_rep('t_type', has_attr('t_type', **kwargs), **kwargs)) + kwargs.update(no_rep('is_null', has_attr('is_null', **kwargs), **kwargs)) + kwargs.update(no_rep('primary_key', has_attr('primary_key', **kwargs), **kwargs)) + kwargs.update(no_rep('comment', has_attr('comment', **kwargs), **kwargs)) + kwargs.update(no_rep('auto_field', has_attr('auto_field', **kwargs), **kwargs)) + kwargs.update(no_rep('auto_time', has_attr('auto_time', **kwargs), **kwargs)) + kwargs.update(no_rep('update_auto_time', has_attr('update_auto_time', **kwargs), **kwargs)) + return kwargs diff --git a/CACodeFramework/util/DbUtil.py b/CACodeFramework/util/DbUtil.py index 43dfe4a..3d3fb61 100644 --- a/CACodeFramework/util/DbUtil.py +++ b/CACodeFramework/util/DbUtil.py @@ -4,7 +4,7 @@ from CACodeFramework.util.Log import CACodeLog from dbutils.pooled_db import PooledDB import pymysql -from CACodeFramework.MainWork.exception import e_except +from CACodeFramework.exception import e_except from CACodeFramework.field import e_fields diff --git a/CACodeFramework/util/Log.py b/CACodeFramework/util/Log.py index 3750a6f..5a37557 100644 --- a/CACodeFramework/util/Log.py +++ b/CACodeFramework/util/Log.py @@ -2,7 +2,7 @@ import os import sys import time -from CACodeFramework.MainWork.exception import e_except +from CACodeFramework.exception import e_except from CACodeFramework.field import e_fields diff --git a/test/test.py b/test/test.py index a32a4c6..1874239 100644 --- a/test/test.py +++ b/test/test.py @@ -1,11 +1,10 @@ import threading -import time +import uuid -from CACodeFramework.util.Log import CACodeLog +from CACodeFramework.anno.annos import Table, Select +from CACodeFramework.anno.aop import AopModel +from CACodeFramework.pojoManager import PojoManager -from CACodeFramework.MainWork import CACodePojo - -from CACodeFramework.MainWork.Annotations import Table from CACodeFramework.util import Config, JsonUtil @@ -25,15 +24,46 @@ class ConF(Config.config): super(ConF, self).__init__(host, port, database, user, password, charset, conf=conf) +def Before(**kwargs): + print('Before:', kwargs) + + +def After(*args, **kwargs): + print('After', args) + print('Result:', kwargs) + + @Table(name="demo_table", msg="demo message") -class Demo(CACodePojo.POJO): +class Demo(PojoManager.pojo): def __init__(self, **kwargs): - self.index = CACodePojo.intField(name='index', primary_key=True) - self.title = CACodePojo.varcharField(length=255) - self.selects = CACodePojo.varcharField(length=255) - self.success = CACodePojo.varcharField(length=255) + self.index = PojoManager.tag.intField(name='index', primary_key=True) + self.title = PojoManager.tag.varcharField(length=255) + self.selects = PojoManager.tag.varcharField(length=255) + self.success = PojoManager.tag.varcharField(length=255) super(Demo, self).__init__(config_obj=ConF(), close_log=True, **kwargs) + @AopModel(before=Before, + before_kwargs={'1': '1'}, + after=After) + def find_title_and_selects(self, **kwargs): + print('function task', kwargs['uid']) + _r = self.orm.find().where(index="<<100").end() + print(_r) + return _r + + @Select() + class find_test(PojoManager.Operation): + def __int__(self): + self.fields = [ + 'all' + ] + + def meta(self): + return Demo() + + +d = Demo() + def setData(): a = [] @@ -97,6 +127,12 @@ if __name__ == '__main__': # print('time:', t2 - t1) # print('data count:', data_count) # print('average:', data_count / (t2 - t1)) - - _r = Demo().orm.update().set(success='true').where(index=17036).end() - print(_r) + d = Demo() + u = uuid.uuid1() + # result = d.find_title_and_selects(uid=u) + # print(JsonUtil.parse(d, True)) + a = d.find_test().run() + # d.before_find_title_and_selects(*d.before_args_find_title_and_selects, + # **d.before_kwargs_find_title_and_selects) + # _r = d.orm.update().set(success='true').where(index=17034).end() + # print(_r) -- Gitee From d1741d9509e5c82a19a5c2bb29830e25039f42ea Mon Sep 17 00:00:00 2001 From: CACode <54068986+cctvadmin@users.noreply.github.com> Date: Wed, 21 Apr 2021 18:03:18 +0800 Subject: [PATCH 07/21] =?UTF-8?q?'=E5=AE=8C=E6=88=90SELECT=E8=A3=85?= =?UTF-8?q?=E9=A5=B0=E5=99=A8'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CACodeFramework/MainWork/opera/__init__.py | 0 CACodeFramework/{MainWork => }/opera/obj_dict.py | 10 ++++++---- CACodeFramework/{MainWork => }/opera/op_db.py | 0 .../pojoManager/{PojoManager.py => Manage.py} | 15 +++++++++++---- 4 files changed, 17 insertions(+), 8 deletions(-) delete mode 100644 CACodeFramework/MainWork/opera/__init__.py rename CACodeFramework/{MainWork => }/opera/obj_dict.py (92%) rename CACodeFramework/{MainWork => }/opera/op_db.py (100%) rename CACodeFramework/pojoManager/{PojoManager.py => Manage.py} (84%) diff --git a/CACodeFramework/MainWork/opera/__init__.py b/CACodeFramework/MainWork/opera/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/CACodeFramework/MainWork/opera/obj_dict.py b/CACodeFramework/opera/obj_dict.py similarity index 92% rename from CACodeFramework/MainWork/opera/obj_dict.py rename to CACodeFramework/opera/obj_dict.py index ac6c20c..d3be4b7 100644 --- a/CACodeFramework/MainWork/opera/obj_dict.py +++ b/CACodeFramework/opera/obj_dict.py @@ -87,13 +87,15 @@ class parses(object): keys = pojo.fields # 在得到值之后解析是否为空并删除为空的值和对应的字段 cp_value = [] + # 复制新的一张字段信息 + keys_copy = [] + values = [getattr(pojo, v) for v in keys] for i, j in enumerate(values): - if j is None or pojo.eq_default(j): - del keys[i] - else: + if j is not None and not pojo.is_default(j): + keys_copy.append(keys[i]) cp_value.append(j) - return ParseUtil().parse_insert(keys, cp_value, __table_name__) + return ParseUtil().parse_insert(keys_copy, cp_value, __table_name__) def parse_obj(self, data: dict, participants): """ diff --git a/CACodeFramework/MainWork/opera/op_db.py b/CACodeFramework/opera/op_db.py similarity index 100% rename from CACodeFramework/MainWork/opera/op_db.py rename to CACodeFramework/opera/op_db.py diff --git a/CACodeFramework/pojoManager/PojoManager.py b/CACodeFramework/pojoManager/Manage.py similarity index 84% rename from CACodeFramework/pojoManager/PojoManager.py rename to CACodeFramework/pojoManager/Manage.py index 2bb4e37..aea0642 100644 --- a/CACodeFramework/pojoManager/PojoManager.py +++ b/CACodeFramework/pojoManager/Manage.py @@ -5,17 +5,24 @@ from CACodeFramework.MainWork import CACodeRepository from abc import ABCMeta, abstractmethod -class pojo(CACodeRepository.Repository): +class Pojo(CACodeRepository.Repository): def __init__(self, config_obj=None, log_conf=None, close_log=False, **kwargs): """ 初始化ORM框架 """ + + if '__table_name__' not in self.__dict__: + self.__table_name__ = self.__class__.__name__ + + if '__table_msg__' not in self.__dict__: + self.__table_msg__ = 'not have msg' + self.__table_name__ = self.__table_name__ self.__table_msg__ = self.__table_msg__ self.fields = self.init_fields() for key, value in kwargs.items(): self.__setattr__(key, value) - super(pojo, self).__init__(config_obj=config_obj, + super(Pojo, self).__init__(config_obj=config_obj, participants=self, log_conf=log_conf, close_log=close_log) @@ -51,7 +58,7 @@ class pojo(CACodeRepository.Repository): """ return self.fields - def eq_default(self, val): + def is_default(self, val): """ 是否等于默认值 """ @@ -79,4 +86,4 @@ class Operation(metaclass=ABCMeta): pass def run(self): - self.run_operation() + return self.result -- Gitee From 1b07368ff59a88f54b38a152fc9ae0339017f1e1 Mon Sep 17 00:00:00 2001 From: CACode <54068986+cctvadmin@users.noreply.github.com> Date: Thu, 22 Apr 2021 09:18:04 +0800 Subject: [PATCH 08/21] =?UTF-8?q?[202104220917]=E5=AE=8C=E5=96=84=E6=9B=B4?= =?UTF-8?q?=E5=A4=9A=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [202104220917]完善更多操作 --- CACodeFramework/MainWork/CACodePureORM.py | 17 ++++- CACodeFramework/MainWork/CACodeRepository.py | 6 +- CACodeFramework/anno/annos.py | 34 ++------- CACodeFramework/opera/obj_dict.py | 2 +- CACodeFramework/opera/op_db.py | 2 +- CACodeFramework/pojoManager/Manage.py | 10 +-- test/test.py | 73 ++++++++++---------- 7 files changed, 69 insertions(+), 75 deletions(-) diff --git a/CACodeFramework/MainWork/CACodePureORM.py b/CACodeFramework/MainWork/CACodePureORM.py index 95ae8e6..2bae367 100644 --- a/CACodeFramework/MainWork/CACodePureORM.py +++ b/CACodeFramework/MainWork/CACodePureORM.py @@ -1,5 +1,5 @@ # 纯净ORM -from CACodeFramework.MainWork.opera import obj_dict, op_db +from CACodeFramework.opera import obj_dict, op_db from CACodeFramework.util.ParseUtil import ParseUtil from CACodeFramework.field.sql_fields import * @@ -30,6 +30,15 @@ class CACodePureORM(object): self.__table_name__ = '{}{}{}'.format(subscript, repository.__table_name__, subscript) self.parses = obj_dict.parses() + self.first_data = False + + def first(self): + """ + 是否只返回第一行数据 + """ + self.first_data = True + return self + # ------------------------主键-------------------------- def insert(self, pojo): @@ -309,7 +318,11 @@ class CACodePureORM(object): # 清空资源,为下一次使用做准备 self.args.clear() self.params.clear() - return _result + if self.first_data: + if type(_result) is list or type(_result) is tuple: + return _result[0] + else: + return _result def con_from(self): """ diff --git a/CACodeFramework/MainWork/CACodeRepository.py b/CACodeFramework/MainWork/CACodeRepository.py index 4fd0061..43adfa3 100644 --- a/CACodeFramework/MainWork/CACodeRepository.py +++ b/CACodeFramework/MainWork/CACodeRepository.py @@ -1,6 +1,6 @@ import copy -from CACodeFramework.MainWork.opera import op_db +from CACodeFramework.opera import op_db from CACodeFramework.util.Log import CACodeLog from CACodeFramework.MainWork.CACodePureORM import CACodePureORM @@ -79,7 +79,7 @@ class Repository(object): # 模板类 self.participants = participants # 该对象的所有字段 - fds = participants.to_dict() + fds = participants.fields self.fields = list(fds.keys()) # 配置类 self.config_obj = config_obj @@ -223,8 +223,6 @@ class Repository(object): - 可自动化操作 - 请尽量使用find_many(sql)操作 :param kwargs:包含所有参数: - pojo:参照对象 - last_id:是否需要返回最后一行数据,默认False sql:处理过并加上%s的sql语句 params:需要填充的字段 print_sql:是否打印sql语句 diff --git a/CACodeFramework/anno/annos.py b/CACodeFramework/anno/annos.py index 6b1cbcf..d68949c 100644 --- a/CACodeFramework/anno/annos.py +++ b/CACodeFramework/anno/annos.py @@ -20,38 +20,18 @@ def Table(name, msg, **kwargs): return set_to_field -def Operations(): - """ - 标注该类为一个操做 - :return: - """ - - def set_to_field(func): - print('1111111') - return func - - return set_to_field - - -def Select(): +def Select(sql, params=None, print_sql=False): def base_func(cls): - cls_obj = cls() - structured = cls_obj.__dict__ - args = [] - kwargs = {} - if 'fields' in structured.keys(): - args.append(structured['fields']) - - for key, value in structured.items(): - if key is not 'fields': - kwargs[key] = value - def _wrapper_(*args, **kwargs): + l = list(args) + del l[0] + cls_obj = cls(*l, **kwargs) obj = cls_obj.meta() - result = obj.orm.find(*args, **kwargs).end() + result = obj.find_sql(sql=sql, params=params, print_sql=print_sql) + setattr(cls_obj, 'result', result) - return result + return cls_obj return _wrapper_ diff --git a/CACodeFramework/opera/obj_dict.py b/CACodeFramework/opera/obj_dict.py index d3be4b7..7a64533 100644 --- a/CACodeFramework/opera/obj_dict.py +++ b/CACodeFramework/opera/obj_dict.py @@ -82,7 +82,7 @@ class parses(object): :param __table_name__:表名 :return: """ - _dict = pojo.to_dict() + _dict = pojo.fields # 得到所有的键 keys = pojo.fields # 在得到值之后解析是否为空并删除为空的值和对应的字段 diff --git a/CACodeFramework/opera/op_db.py b/CACodeFramework/opera/op_db.py index f850c1a..a7a4d43 100644 --- a/CACodeFramework/opera/op_db.py +++ b/CACodeFramework/opera/op_db.py @@ -2,7 +2,7 @@ import threading from CACodeFramework.util.Log import CACodeLog -from CACodeFramework.MainWork.opera.obj_dict import parses +from CACodeFramework.opera.obj_dict import parses from CACodeFramework.field.sql_fields import * from CACodeFramework.util.ParseUtil import ParseUtil diff --git a/CACodeFramework/pojoManager/Manage.py b/CACodeFramework/pojoManager/Manage.py index aea0642..aa0ebff 100644 --- a/CACodeFramework/pojoManager/Manage.py +++ b/CACodeFramework/pojoManager/Manage.py @@ -15,7 +15,7 @@ class Pojo(CACodeRepository.Repository): self.__table_name__ = self.__class__.__name__ if '__table_msg__' not in self.__dict__: - self.__table_msg__ = 'not have msg' + self.__table_msg__ = 'The current object has no description' self.__table_name__ = self.__table_name__ self.__table_msg__ = self.__table_msg__ @@ -44,19 +44,21 @@ class Pojo(CACodeRepository.Repository): continue return fds - def to_json(self): + def to_json(self, bf=False): """ 将此对象转换为json + :param bf:是否需要格式化 + 无视时间报错 """ - return JsonUtil.parse(self) + return JsonUtil.parse(self, bf) def to_dict(self): """ 将此对象转换成字典格式 """ - return self.fields + return JsonUtil.load(JsonUtil.parse(self)) def is_default(self, val): """ diff --git a/test/test.py b/test/test.py index 1874239..10583bb 100644 --- a/test/test.py +++ b/test/test.py @@ -3,7 +3,7 @@ import uuid from CACodeFramework.anno.annos import Table, Select from CACodeFramework.anno.aop import AopModel -from CACodeFramework.pojoManager import PojoManager +from CACodeFramework.pojoManager import Manage from CACodeFramework.util import Config, JsonUtil @@ -34,45 +34,43 @@ def After(*args, **kwargs): @Table(name="demo_table", msg="demo message") -class Demo(PojoManager.pojo): +class demo_table(Manage.Pojo): def __init__(self, **kwargs): - self.index = PojoManager.tag.intField(name='index', primary_key=True) - self.title = PojoManager.tag.varcharField(length=255) - self.selects = PojoManager.tag.varcharField(length=255) - self.success = PojoManager.tag.varcharField(length=255) - super(Demo, self).__init__(config_obj=ConF(), close_log=True, **kwargs) - - @AopModel(before=Before, - before_kwargs={'1': '1'}, - after=After) + self.t_id = Manage.tag.intField(primary_key=True) + self.t_name = Manage.tag.varcharField(length=255) + self.t_pwd = Manage.tag.varcharField(length=255) + self.t_msg = Manage.tag.varcharField(length=255) + self.create_time = Manage.tag.datetimeField(auto_time=True) + self.update_time = Manage.tag.datetimeField(update_auto_time=True) + + super(demo_table, self).__init__(config_obj=ConF(), close_log=True, **kwargs) + + @AopModel(before=Before, before_kwargs={'1': '1'}, after=After) def find_title_and_selects(self, **kwargs): print('function task', kwargs['uid']) - _r = self.orm.find().where(index="<<100").end() + _r = self.orm.find().end() print(_r) return _r - @Select() - class find_test(PojoManager.Operation): - def __int__(self): - self.fields = [ - 'all' - ] + @Select(sql='SELECT * FROM demo_table WHERE t_id=%s', params=[1]) + class find_all_where_tid(Manage.Operation): + def __init__(self, t_id): + self.t_id = t_id def meta(self): - return Demo() - - -d = Demo() + return demo_table() def setData(): a = [] - h = Demo() - for i in range(2): - h = Demo(title="test title", selects="test selects", success='false') - a.append(h) + h = demo_table() + for i in range(1000): + h = demo_table(t_name='{}{}'.format('测试name', i), t_pwd='{}{}'.format('测试pwd', i), + t_msg='{}{}'.format('测试msg', i)) + # a.append(h) + h.save() # _result = testClass.insert_one(pojo=h) - _r = Demo().orm.insert(h).end() + # _r = demo_table().orm.insert(h).end() # h.insert_many(pojo_list=a) # _result = testClass.insert_many(pojo_list=pojos) # print('受影响行数:{}\t,\t已插入:{}'.format(_result, i)) @@ -84,26 +82,26 @@ data_count = 0 def th(): def A(): for i in range(100): - d = Demo() + d = demo_table() a = d.find_sql(sql='SELECT * FROM demo_table') global data_count data_count += len(a) def B(): for i in range(100): - b = Demo().find_many(sql='SELECT * FROM demo_table') + b = demo_table().find_many(sql='SELECT * FROM demo_table') global data_count data_count += len(b) def C(): for i in range(100): - c = Demo().find_all() + c = demo_table().find_all() global data_count data_count += len(c) def D(): for i in range(100): - d = Demo().find_by_field('title', 'selects') + d = demo_table().find_by_field('title', 'selects') global data_count data_count += len(d) @@ -116,7 +114,7 @@ def th(): if __name__ == '__main__': # setData() - # c = Demo().orm.find('count(*)', asses=['c'], h_func=True).end()[0] + # c = demo_table().orm.find('count(*)', asses=['c'], h_func=True).end()[0] # print('count:', c.c) # t1 = time.time() # t = th() @@ -127,11 +125,14 @@ if __name__ == '__main__': # print('time:', t2 - t1) # print('data count:', data_count) # print('average:', data_count / (t2 - t1)) - d = Demo() - u = uuid.uuid1() + d = demo_table() + # u = uuid.uuid1() # result = d.find_title_and_selects(uid=u) - # print(JsonUtil.parse(d, True)) - a = d.find_test().run() + # print(JsonUtil.parse(result, True)) + # a = d.find_all_where_tid(1).run() + # print(a) + re = d.orm.find('t_id', 't_name', 't_pwd').where(t_id="<<10").first().end() + print(re.to_json(True)) # d.before_find_title_and_selects(*d.before_args_find_title_and_selects, # **d.before_kwargs_find_title_and_selects) # _r = d.orm.update().set(success='true').where(index=17034).end() -- Gitee From 220bf9b0a3fad0b35331ef0449da161165ad9ee9 Mon Sep 17 00:00:00 2001 From: CACode Date: Sat, 24 Apr 2021 20:16:10 +0800 Subject: [PATCH 09/21] =?UTF-8?q?'=E6=96=B0=E7=89=88=E5=8A=A0=E5=85=A5?= =?UTF-8?q?=E8=A3=85=E7=A4=BA=E5=99=A8=E6=A8=A1=E5=BC=8F=EF=BC=8C=E5=8F=AF?= =?UTF-8?q?=E5=83=8F=E9=80=9A=E8=BF=87=E6=B3=A8=E8=A7=A3=E6=89=A7=E8=A1=8C?= =?UTF-8?q?sql'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CACodeFramework/exception/e_except.py | 41 -------------- .../{field => exception}/e_fields.py | 0 util/Generate POJOs.groovy | 56 ------------------- util/__init__.py | 0 4 files changed, 97 deletions(-) delete mode 100644 CACodeFramework/exception/e_except.py rename CACodeFramework/{field => exception}/e_fields.py (100%) delete mode 100644 util/Generate POJOs.groovy delete mode 100644 util/__init__.py diff --git a/CACodeFramework/exception/e_except.py b/CACodeFramework/exception/e_except.py deleted file mode 100644 index d76a1c8..0000000 --- a/CACodeFramework/exception/e_except.py +++ /dev/null @@ -1,41 +0,0 @@ -from datetime import datetime -import warnings - -from CACodeFramework.field import e_fields - - -def warn(obj, line, msg, f_warn, LogObject=None, task_name='\t\tMAIN'): - """作者:CACode 最后编辑于2021/4/13 - - 输出日志并返回日志内容 - - 此方法不会中断程序运行 - - 格式: - - 时间 类型 日志名称 对象地址 被调用行号 执行类型 信息 - 示例: - - line:234: Warning: 2021-04-13 08:24:08.169 WARN CACode-Database-Operation [1907116304800] [line:234] [2021-04-13 08:24:08.169] :INITIALIZE THIS OBJECT - """ - t = datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3] - info = '{} {} {} [{}] [{}] [{}] \t\t\t:{}'.format(t, f_warn, - e_fields.LOG_OPERA_NAME, - id(obj), - obj.__str__(), - task_name, - msg) - # 输出日志信息 - warnings.warn_explicit(info, category=Warning, filename='line', lineno=line) - if LogObject is not None: - LogObject.warn(info) - return info - - -def error(cls, msg): - """作者:CACode 最后编辑于2021/4/13 - - 抛出异常并终止程序执行 - Atte - """ - raise cls(msg) diff --git a/CACodeFramework/field/e_fields.py b/CACodeFramework/exception/e_fields.py similarity index 100% rename from CACodeFramework/field/e_fields.py rename to CACodeFramework/exception/e_fields.py diff --git a/util/Generate POJOs.groovy b/util/Generate POJOs.groovy deleted file mode 100644 index e13535a..0000000 --- a/util/Generate POJOs.groovy +++ /dev/null @@ -1,56 +0,0 @@ -import com.intellij.database.model.DasTable -import com.intellij.database.util.Case -import com.intellij.database.util.DasUtil - -/* - 你可以使用此脚本快捷生成POJO对象 - 最终效果为: - from CACodeFramework.MainWork.CACodePojo import POJO - - - class table(POJO): - def __init__(self): - self.shopId = None - self.title = None - self.icon = None - self.createTime = None - self.updateTime = None - - */ - -FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir -> - SELECTION.filter { it instanceof DasTable }.each { generate(it, dir) } -} - -def generate(table, dir) { - def className = javaName(table.getName(), false) - def fields = calcFields(table) - new File(dir, className + ".py").withPrintWriter { out -> generate(out, className, fields) } -} - -def generate(out, className, fields) { - out.println "from CACodeFramework.MainWork.CACodePojo import POJO" - out.println "" - out.println "" - out.println "class table(POJO):" - out.println " def __init__(self):" - fields.each() { - out.println " self.${it.name} = None" - } -} - -def calcFields(table) { - DasUtil.getColumns(table).reduce([]) { fields, col -> - def spec = Case.LOWER.apply(col.getDataType().getSpecification()) - fields += [[ - name : javaName(col.getName(), false)]] - } -} - -def javaName(str, capitalize) { - def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str) - .collect { Case.LOWER.apply(it).capitalize() } - .join("") - .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_") - capitalize || s.length() == 1? s : Case.LOWER.apply(s[0]) + s[1..-1] -} diff --git a/util/__init__.py b/util/__init__.py deleted file mode 100644 index e69de29..0000000 -- Gitee From bada9300705c475da3badb5f24c98a35fff22c41 Mon Sep 17 00:00:00 2001 From: CACode Date: Sat, 24 Apr 2021 20:23:16 +0800 Subject: [PATCH 10/21] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E5=88=86=E6=94=AF?= =?UTF-8?q?=EF=BC=8C=E8=AF=B7=E5=8B=BF=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit '新版加入装示器模式,可像通过注解执行sql' --- CACodeFramework/MainWork/CACodePureORM.py | 12 +- CACodeFramework/MainWork/CACodeRepository.py | 2 +- CACodeFramework/anno/annos.py | 31 +- CACodeFramework/exception/e_fields.py | 4 + CACodeFramework/opera/obj_dict.py | 24 +- CACodeFramework/opera/op_db.py | 5 +- CACodeFramework/pojoManager/Manage.py | 19 +- CACodeFramework/util/Config.py | 9 +- CACodeFramework/util/DbUtil.py | 18 +- CACodeFramework/util/Log.py | 41 +- README.md | 547 +------------------ test/test.py | 70 +-- 12 files changed, 136 insertions(+), 646 deletions(-) diff --git a/CACodeFramework/MainWork/CACodePureORM.py b/CACodeFramework/MainWork/CACodePureORM.py index 2bae367..ffe27d1 100644 --- a/CACodeFramework/MainWork/CACodePureORM.py +++ b/CACodeFramework/MainWork/CACodePureORM.py @@ -1,5 +1,7 @@ # 纯净ORM +from CACodeFramework.exception import e_fields from CACodeFramework.opera import obj_dict, op_db +from CACodeFramework.util.Log import CACodeLog from CACodeFramework.util.ParseUtil import ParseUtil from CACodeFramework.field.sql_fields import * @@ -253,6 +255,12 @@ class CACodePureORM(object): find('all').desc().end() find('all').order_by('param').desc().limit(10,20) """ + + if order_by_str not in self.args: + raise CACodeLog.err(AttributeError, + e_fields.CACode_SQLERROR( + 'There is no `order by` field before calling `desc` field,You have an error in your SQL syntax')) + self.args.append(desc_str) return self @@ -270,7 +278,7 @@ class CACodePureORM(object): # set是加逗号不是and self.args.append(comma) self.params.append(value) - self.rep_sym(comma, '') + self.rep_sym(comma) return self # ------------------------预设符-------------------------- @@ -291,7 +299,7 @@ class CACodePureORM(object): 最终执行任务 """ sql = '' - conf = self.repository.config_obj.conf + conf = self.repository.config_obj.get_dict() print_sql = 'print_sql' in conf.keys() and conf['print_sql'] is True last_id = 'last_id' in conf.keys() and conf['last_id'] is True for i in self.args: diff --git a/CACodeFramework/MainWork/CACodeRepository.py b/CACodeFramework/MainWork/CACodeRepository.py index 43adfa3..6fc50e8 100644 --- a/CACodeFramework/MainWork/CACodeRepository.py +++ b/CACodeFramework/MainWork/CACodeRepository.py @@ -75,7 +75,7 @@ class Repository(object): self.operation = op_db.DbOperation() self.parse = op_db.parses() if not self.close_log: - CACodeLog.log(_obj=self, msg='Being Initialize this object') + CACodeLog.log(obj=self, msg='Being Initialize this object') # 模板类 self.participants = participants # 该对象的所有字段 diff --git a/CACodeFramework/anno/annos.py b/CACodeFramework/anno/annos.py index d68949c..04f0ccc 100644 --- a/CACodeFramework/anno/annos.py +++ b/CACodeFramework/anno/annos.py @@ -1,5 +1,4 @@ -import types -from functools import wraps +import re def Table(name, msg, **kwargs): @@ -20,7 +19,22 @@ def Table(name, msg, **kwargs): return set_to_field -def Select(sql, params=None, print_sql=False): +def parse_kwargs(params, pattern, kwargs): + """ + 通过${key}方式解析特殊字段 + """ + new_args = [] + for i in params: + context = re.match(pattern, str(i)) + if context: + key = str(context.string).replace('${', '').replace('}', '') + new_args.append(kwargs[key]) + else: + new_args.append(i) + return new_args + + +def Select(sql, params=None, print_sql=False, first=False): def base_func(cls): def _wrapper_(*args, **kwargs): l = list(args) @@ -28,10 +42,15 @@ def Select(sql, params=None, print_sql=False): cls_obj = cls(*l, **kwargs) obj = cls_obj.meta() - result = obj.find_sql(sql=sql, params=params, print_sql=print_sql) - setattr(cls_obj, 'result', result) + new_args = parse_kwargs(params, r'^\${.*}$', kwargs) + + result = obj.find_sql(sql=sql, params=new_args, print_sql=print_sql) + # setattr(cls_obj, 'result', result) + if first: + if type(result) is list and len(result) != 0: + result = result[0] - return cls_obj + return result return _wrapper_ diff --git a/CACodeFramework/exception/e_fields.py b/CACodeFramework/exception/e_fields.py index 1d1b89f..6600835 100644 --- a/CACodeFramework/exception/e_fields.py +++ b/CACodeFramework/exception/e_fields.py @@ -6,3 +6,7 @@ WARN = 'WARN' INFO = 'INFO' DB_TASK = 'DATABASE OPERATION' PARSE_ERROR = 'CACode-Parse' + + +def CACode_SQLERROR(msg): + return '%s:%s' % ('CACode-Sql', msg) diff --git a/CACodeFramework/opera/obj_dict.py b/CACodeFramework/opera/obj_dict.py index 7a64533..8f97b20 100644 --- a/CACodeFramework/opera/obj_dict.py +++ b/CACodeFramework/opera/obj_dict.py @@ -1,8 +1,8 @@ import copy import sys -from CACodeFramework.exception import e_except -from CACodeFramework.field import e_fields +from CACodeFramework.exception import e_fields +from CACodeFramework.util.Log import CACodeLog from CACodeFramework.util.ParseUtil import ParseUtil @@ -21,7 +21,7 @@ class parses(object): # 获得该函数被调用前的行号 _l = sys._getframe().f_back.f_lineno # 格式:时间 类型 日志名称 对象地址 被调用行号 执行类型 信息 - info = e_except.warn(obj=_obj, line=_l, task_name=name, f_warn=e_fields.INFO, msg=msg, LogObject=LogObject) + info = CACodeLog.warn(obj=_obj, line=_l, task_name=name, f_warn=e_fields.INFO, msg=msg, LogObject=LogObject) def last_id(self, **kwargs): """作者:CACode 最后编辑于2021/4/12 @@ -45,11 +45,10 @@ class parses(object): conf_obj:配置类 """ conf_obj = kwargs['config_obj'] - if 'last_id' not in kwargs.keys(): - if 'last_id' in conf_obj.conf.keys(): - kwargs['last_id'] = conf_obj.conf['last_id'] - else: - kwargs['last_id'] = False + if getattr(conf_obj, 'last_id'): + kwargs['last_id'] = conf_obj.last_id + else: + kwargs['last_id'] = False return kwargs def print_sql(self, **kwargs): @@ -65,11 +64,10 @@ class parses(object): conf_obj:配置类 """ conf_obj = kwargs['config_obj'] - if 'print_sql' not in kwargs.keys(): - if 'print_sql' in conf_obj.conf.keys(): - kwargs['print_sql'] = conf_obj.conf['print_sql'] - else: - kwargs['print_sql'] = False + if getattr(conf_obj, 'print_sql'): + kwargs['print_sql'] = conf_obj.print_sql + else: + kwargs['print_sql'] = False return kwargs def parse_insert(self, pojo, __table_name__): diff --git a/CACodeFramework/opera/op_db.py b/CACodeFramework/opera/op_db.py index a7a4d43..2b6e33e 100644 --- a/CACodeFramework/opera/op_db.py +++ b/CACodeFramework/opera/op_db.py @@ -30,7 +30,8 @@ class DbOperation(object): _lock = kwargs['t_local'] name = kwargs['__task_uuid__'] if not _lock.close_log: - CACodeLog.log(_obj=kwargs['func'], msg='TASK-{} START'.format(name), name=name, LogObject=kwargs['log_obj']) + CACodeLog.log(obj=kwargs['func'], msg='TASK-{} START'.format(name), task_name=name, + LogObject=kwargs['log_obj'] if 'log_obj' in kwargs.keys() else None) # # 设置任务 # _kw = JsonUtil.load(JsonUtil.parse(_lock)) _kw = _lock.__dict__ @@ -38,7 +39,7 @@ class DbOperation(object): _t = threading.Thread(target=func, args=args, kwargs=kwargs, name=name) _t.start() if not _lock.close_log: - CACodeLog.log(_obj=_t, msg='TASK-{} RUNNING'.format(name), name=name, LogObject=kwargs['log_obj']) + CACodeLog.log(obj=_t, msg='TASK-{} RUNNING'.format(name), task_name=name, LogObject=kwargs['log_obj']) # 等待任务完成 _t.join() # 返回结果 diff --git a/CACodeFramework/pojoManager/Manage.py b/CACodeFramework/pojoManager/Manage.py index aa0ebff..3e8b097 100644 --- a/CACodeFramework/pojoManager/Manage.py +++ b/CACodeFramework/pojoManager/Manage.py @@ -2,7 +2,6 @@ from CACodeFramework.MainWork.CACodePureORM import CACodePureORM from CACodeFramework.pojoManager import tag from CACodeFramework.util import JsonUtil from CACodeFramework.MainWork import CACodeRepository -from abc import ABCMeta, abstractmethod class Pojo(CACodeRepository.Repository): @@ -19,7 +18,7 @@ class Pojo(CACodeRepository.Repository): self.__table_name__ = self.__table_name__ self.__table_msg__ = self.__table_msg__ - self.fields = self.init_fields() + self.init_fields() for key, value in kwargs.items(): self.__setattr__(key, value) super(Pojo, self).__init__(config_obj=config_obj, @@ -42,7 +41,9 @@ class Pojo(CACodeRepository.Repository): fds[key] = value except SyntaxError: continue - return fds + + self.fields = fds + self.__fields__ = fds def to_json(self, bf=False): """ @@ -77,15 +78,3 @@ class Pojo(CACodeRepository.Repository): 转ORM框架 """ return CACodePureORM(self) - - -class Operation(metaclass=ABCMeta): - def __int__(self): - pass - - @abstractmethod - def meta(self): - pass - - def run(self): - return self.result diff --git a/CACodeFramework/util/Config.py b/CACodeFramework/util/Config.py index c23051f..4dac0a9 100644 --- a/CACodeFramework/util/Config.py +++ b/CACodeFramework/util/Config.py @@ -49,8 +49,8 @@ class config(object): :param value:值 :return: """ - self.conf[key] = value - return config + setattr(self, key, value) + return None def get_field(self, name): """ @@ -58,8 +58,9 @@ class config(object): :param name: :return: """ - _this = self.get_dict() - return _this[name] + if hasattr(self, name): + return getattr(self, name) + return None def get_dict(self): """ diff --git a/CACodeFramework/util/DbUtil.py b/CACodeFramework/util/DbUtil.py index 3d3fb61..dfe0001 100644 --- a/CACodeFramework/util/DbUtil.py +++ b/CACodeFramework/util/DbUtil.py @@ -4,9 +4,6 @@ from CACodeFramework.util.Log import CACodeLog from dbutils.pooled_db import PooledDB import pymysql -from CACodeFramework.exception import e_except -from CACodeFramework.field import e_fields - def parse_kwa(db, **kwargs): """ @@ -19,6 +16,7 @@ def parse_kwa(db, **kwargs): params:需要填充的字段 print_sql:是否打印sql语句 """ + try: cursor = db.cursor() if 'params' in kwargs.keys(): @@ -27,8 +25,8 @@ def parse_kwa(db, **kwargs): sql = kwargs['sql'] if 'print_sql' in kwargs.keys() and kwargs['print_sql'] is True: _l = sys._getframe().f_back.f_lineno - e_except.warn(obj=db, line=_l, task_name='Print Sql', f_warn=e_fields.INFO, msg=sql) - CACodeLog.log(_obj=db, msg='Being Initialize this object') + CACodeLog.log(obj=db, line=_l, task_name='Print Sql', msg=sql) + cursor.execute(sql) return cursor except Exception as e: @@ -38,9 +36,13 @@ def parse_kwa(db, **kwargs): class Db_opera(object): """ + 操作数据库类 + """ + instance = None + def __init__(self, host, port, user, password, database, charset, creator=pymysql, maxconnections=6, mincached=2, maxcached=5, maxshared=3, blocking=True, setsession=[], ping=0, POOL=None): """ @@ -182,3 +184,9 @@ class Db_opera(object): params:需要填充的字段 """ self.insert(**kwargs) + + def __new__(cls, *args, **kwargs): + if Db_opera.instance is None: + Db_opera.instance = object.__new__(cls) + + return Db_opera.instance diff --git a/CACodeFramework/util/Log.py b/CACodeFramework/util/Log.py index 5a37557..89ea5d7 100644 --- a/CACodeFramework/util/Log.py +++ b/CACodeFramework/util/Log.py @@ -1,9 +1,11 @@ +import binascii +import datetime import os import sys import time +import warnings -from CACodeFramework.exception import e_except -from CACodeFramework.field import e_fields +from CACodeFramework.exception import e_fields def date_format(time_obj=time, fmt='%Y-%m-%d %H:%M:%S'): @@ -70,22 +72,45 @@ class CACodeLog(object): self.save_flag = save_flag @staticmethod - def log(_obj, msg, name='\t\tTask', LogObject=None): + def log(obj, msg, line=sys._getframe().f_back.f_lineno, task_name='\t\tTask', LogObject=None): """ 输出任务执行日志 - :param _obj:执行日志的对象地址 + :param obj:执行日志的对象地址 :param msg:消息 - :param name:任务对象的值 + :param line:被调用前的行数 + :param task_name:任务对象的值 :param LogObject:写出文件的对象 """ - # 获得该函数被调用前的行号 - _l = sys._getframe().f_back.f_lineno + # 格式:时间 类型 日志名称 对象地址 被调用行号 执行类型 信息 - info = e_except.warn(obj=_obj, line=_l, task_name=name, f_warn=e_fields.INFO, msg=msg, LogObject=LogObject) + + def str_to_hexStr(string): + str_bin = string.encode('utf-8') + return binascii.hexlify(str_bin).decode('utf-8') + + t = datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3] + info = '[{}] [\t{}] [{}] [\t{}] [{}] [{}] \t\t\t:{}'.format(t, + e_fields.INFO, + e_fields.LOG_OPERA_NAME, + id(obj), + obj.__str__(), + task_name, + msg) + # 输出日志信息 + warnings.warn_explicit(info, category=Warning, filename='line', lineno=line) + if LogObject is not None: + LogObject.warn(info) + return info + @staticmethod + def err(cls, msg, LogObject=None): + if LogObject is not None: + LogObject.warn(msg) + raise cls(msg) + def success(self, content): """ 成功日志 diff --git a/README.md b/README.md index 63c2555..210f58e 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,11 @@ pip命令:pip install CACodeFramework +# 基础依赖 + + pymysql>=0.7.0 + python>=3.6 + # 作者 author:cacode @@ -52,548 +57,6 @@ ![流程图](./imgs/lct.png "流程图") -# 版本更新: - -## 1.1.2.1 - -- 修复多线程下查询报错 -- 查询速度显著提高 -- 使用ThreadLocal保持线程单一性 -- 去除彩蛋 - - 框架就应该有框架的样子 - -- 教程正在录制中。。。 - -## 1.1.1.1 - --- 修复半自动Repository的insert相关解析失败 --- 修复全自动ORM执行失败 --- 新增group_by(*args) --- 新增一个2048小彩蛋 - -## 1.1.0.03: - -- 修复JsonUtil.parse(obj) - - 部分字典dict解析失败 - -- 新增asses字段 - - 可以使用:orm.find('title', 'success', asses=['t', None]).end()将索引对应字段转成另一个别名 最后的结果就是:SELECT `title` FROM `demo_table` - as t - -## 1.1.0.2: - -- 修复find - - 无法返回POJO - - 解析深度不够 - -- 修复PureORM - - 修复返回值为dict而非POJO问题 - -## 1.0.2.1: - -- 修复JsonUtil - - 无法解析对象 - - 解析不完整 - - 解析不到深层 - -- 新增纯ORM模式 - - 增加类PureORM(object) - - __init__(repository) - - insert() - - delete() - - update() - - by(*args) - - order_by(*args) - - desc() - - set(**kwargs) - - where(**kwargs) - - limit(star,end) - - ander(**kwargs) - - run() - - end() - -# 使用指北: - -内部配置规则: - - 内部参数 大于 配置文件 - 你可以像理解css一样理解 - -## 基本代码 base code - -我怕有人因为没看说明调用报错找不到原因 -按照这个demo可以运行你的第一份使用CACodeFramework的代码 -前提是你已经认真看完教程 - -以下内容均依赖这个代码 - - from CACodeFramework.MainWork import CACodeRepository, CACodePojo - from CACodeFramework.MainWork.Annotations import Table - from CACodeFramework.MainWork.CACodePureORM import CACodePureORM - from CACodeFramework.util import Config, JsonUtil - - - class ConF(Config.config): - def __init__(self, host='localhost', port=3306, database='demo', user='root', password='123456', charset='utf8'): - conf = { - "print_sql": True, - "last_id": True, - } - super(ConF, self).__init__(host, port, database, user, password, charset, conf=conf) - - - class Demo(CACodePojo.POJO): - def __init__(self): - self.index = None - self.title = None - self.selects = None - self.success = None - - - @Table(name="demo_table", msg="demo message") - class TestClass(CACodeRepository.Repository): - def __init__(self): - super(TestClass, self).__init__(config_obj=ConF(), participants=Demo()) - - - testClass = TestClass() - orm = CACodePureORM(testClass) - -## 基本语法符号 - -在这个框架中 -大于号: `>>` -小于号:`<<` -只有这两个符号才是做重复处理,其他的照常编写 - -## 工具类 - -### JsonUtil - -#### JsonUtil.parse(obj) -> dict: - - 将dict解析成json - -#### JsonUtil.load(obj) -> dict: - - 将json解析成dict - ------- - -## 半自动: - -### 增 - -#### insert_sql(**kwargs)->(tuple(int,int)): - - 使用sql插入 - :param kwargs:包含所有参数: - pojo:参照对象 - last_id:是否需要返回最后一行数据,默认False - sql:处理过并加上%s的sql语句 - params:需要填充的字段 - :return rowcount,last_id if last_id=True - -教程编写匆忙,如果错误请务必联系我们 - -##### 示例 - - _result = testClass.insert_sql( - sql="INSERT INTO `demo_table` (`title`,`selects`,`success`) VALUES (%s,%s,%s)", - params=['test title', 'test selects', 'false']) - print(_result) - -##### 返回结果 - - INSERT INTO `demo_table` (`title`,`selects`,`success`) VALUES ('test title','test selects','false') - (1, 5) - -##### 示例解释 - -调用 `insert_sql()` 方法,并设置使用 `%s` 加以处理的sql语句 - ------- - -#### insert_one(**kwargs)->(tuple(int,int)): - - 插入属性: - 返回受影响行数 - :param kwargs:包含所有参数: - pojo:参照对象 - last_id:是否需要返回最后一行数据,默认False - params:需要填充的字段 - :return:rowcount,last_id if last_id=True - -教程编写匆忙,如果错误请务必联系我们 - -##### 示例 - - h = Demo() - h.title = "test title" - h.selects = "test selects" - h.success = "false" - _result = testClass.insert_one(pojo=h) - print(_result) - -##### 返回结果 - - INSERT INTO `demo_table` (`title`,`selects`,`success`) VALUES ('test title','test selects','false') - (1, 6) - -##### 示例解释 - -调用 `insert_one()` 方法,并设置pojo为一个实体类对象,框架内部会自动转换为合适的参数构造并执行 -最后返回受影响行数和最后一行数据的ID ------- - -#### insert_many(**kwargs)->(tuple(int,int)): - - 插入多行 - 这个是用insert_one插入多行 - :param kwargs:包含所有参数: - pojo_list:参照对象列表 - last_id:是否需要返回最后一行数据,默认False - sql:处理过并加上%s的sql语句 - params:需要填充的字段 - :return:list[rowcount,last_id if last_id=True] - -教程编写匆忙,如果错误请务必联系我们 - -##### 示例 - - pojos = [] - for i in range(2): - h = Demo() - h.title = "test title" - h.selects = "test selects" - h.success = "false" - pojos.append(h) - _result = testClass.insert_many(pojo_list=pojos) - print(_result) - -##### 返回结果 - - INSERT INTO `demo_table` (`title`,`selects`,`success`) VALUES ('test title','test selects','false') - INSERT INTO `demo_table` (`title`,`selects`,`success`) VALUES ('test title','test selects','false') - [(1, 10), (1, 11)] - -##### 示例解释 - -调用 `insert_many()` 方法,并设置pojo_list为一个多个实体类对象的集合,内部会自动将其分解为多个个体执行 -最后返回受影响行数和最后一行数据的ID - -### 删 - -#### update(sql): - - 由于删除也是更新操做,所以在CACodeFramework种,delete操做等同于update操做 - 故不设置delete - -### 改 - -#### update(**kwargs): - -##### 示例 - - _result = testClass.update(sql='update `demo_table` set title=%s where `index` < %s', params=['test update', 7]) - print(_result) - -##### 返回结果 - - update `demo_table` set title='test update' where `index` < 7 - (6, 0) - -##### 示例解释 - -调用 `update()` 方法,并设置更新语句 -最后返回受影响行数 无法返回最后一行ID - -### 查 - -#### find_sql(**kwargs): - - 返回多个数据并用list包装: - - 可自动化操作 - - 请尽量使用find_many(sql)操作 - :param kwargs:包含所有参数: - pojo:参照对象 - last_id:是否需要返回最后一行数据,默认False - sql:处理过并加上%s的sql语句 - params:需要填充的字段 - print_sql:是否打印sql语句 - -##### 示例 - - _result = testClass.find_sql(sql='SELECT * FROM demo_table WHERE `index`=%s', params=[3]) - print(_result) - -##### 返回结果 - - SELECT * FROM demo_table WHERE `index`=3 - [{'index': 3, 'title': 'test update', 'selects': '60', 'success': 'true'}] - -##### 示例解释 - -调用 `find_sql()` 方法,并设置查询sql语句 内部将结果封装成list返回 - -#### find_all(**kwargs): - - 查询所有 - :return:将所有数据封装成POJO对象并返回 - -##### 示例 - - _result = testClass.find_all() - print(_result) - -##### 返回结果 - - SELECT `index`,`title`,`selects`,`success` FROM demo_table - [<__main__.Demo object at 0x00000214D61DB8E0>, - <__main__.Demo object at 0x00000214D61DBA60>, - <__main__.Demo object at 0x00000214D61DBA90>, - ....] - -##### 示例解释 - -调用 `find_all()` 方法,将所有数据封装成POJO对象返回,其返回的item内部构造类似: - - 'pojo':{'index': 1, 'title': 'test update', 'selects': '60', 'success': 'false'} - -#### find_by_field(**kwargs): - - 只查询指定名称的字段,如: - SELECT user_name FROM `user` - 即可参与仅解析user_name为主的POJO对象 - :param args:需要参与解析的字段名 - :return:将所有数据封装成POJO对象并返回 - -##### 示例 - - _result = testClass.find_by_field('title', 'selects') - print(_result) - -##### 返回结果 - - SELECT `title`,`selects` FROM demo_table - [<__main__.Demo object at 0x000002997F2D1A30>, - <__main__.Demo object at 0x000002997F2D1BE0, - ....>, - -##### 示例解释 - -调用 `find_by_field()` 方法,查询所有保留的字段,其返回的item内部构造类似: - - 'pojo':{'index': None, 'title': 'test update', 'selects': '60', 'success': None} - -#### find_one(**kwargs): - - 查找第一条数据 - 可以是一条 - 也可以是很多条中的第一条 - code: - _result = self.find_many(**kwargs) - if len(_result) == 0: - return None - else: - return _result[0] - :param kwargs:包含所有参数: - pojo:参照对象 - last_id:是否需要返回最后一行数据,默认False - sql:处理过并加上%s的sql语句 - params:需要填充的字段 - print_sql:是否打印sql语句 - :return 返回使用find_many()的结果种第一条 - -##### 示例 - - _result = testClass.find_one(sql='select * from `demo_table` where `index`=%s', params=[3]) - print(_result) - -##### 返回结果 - - select * from `demo_table` where `index`=3 - <__main__.Demo object at 0x000001B30AF71B50> - -##### 示例解释 - - 调用 `find_one()` 方法,查询所有保留的字段,其返回值内部构造类似: - 'pojo':{'index': None, 'title': 'test update', 'selects': '60', 'success': None} - -#### find_many(sql): - -##### 示例 - - _result = testClass.find_many(sql='select * from `demo_table` where `index`<%s', params=[3]) - print(_result) - -##### 返回结果 - - select * from `demo_table` where `index`<3 - [<__main__.Demo object at 0x000002096712AA60>, <__main__.Demo object at 0x000002096712AAC0>] - -##### 示例解释 - -参考 `find_by_field()` ,因为该方法将POJO类的字段作为`find_by_field()`的参数并执行 - ------- - -## 全自动: - -### 增 - -#### insert(pojo): - - 插入一条数据 - example: - insert() - insert('c1','c2') - :param pojo:需要插入的对象 - -##### 示例 - - h = Demo() - h.title = "test title" - h.selects = "test selects" - h.success = "false" - _result = orm.insert(h).end() - print(_result) - -##### 返回结果 - - INSERT INTO `demo_table` ( `title`,`selects`,`success` ) VALUES ( 'test title','test selects','false' ) - (1, 18) - -##### 示例解释 - -调用 `insert()`方法并传入一个POJO对象,实现对该表的插入,并按照配置返回受影响行数和最后一行的ID - -### 删 - -#### delete(): - -##### 示例 - - _orm = orm.delete().where(index='<<3').end() - print(_orm) - -##### 返回结果 - - DELETE FROM `demo_table` WHERE `index`<<'3' - (3, 0) - -##### 示例解释 - -调用 `delete()`方法并设置where内的参数即可删除数据,请一定要设置where,否则将像sql语句那样执行全部删除 - -### 改 - -#### update(sql): - - 更新 - example: - update().set(key=value).where(key1=value1) - -##### 示例 - - _orm = orm.update().set(title='test', selects='selects').where(index='<<3').end() - print(_orm) - -##### 返回结果 - - UPDATE `demo_table` SET `title`='test',`selects`='selects' WHERE `index`<'3' - (2, 0) - -##### 示例解释 - -调用 `update()`方法并设置`set()`内参数和`where()`内参数即可更改该行数据,返回受影响行数,没有last_id是因为不支持 - -### 查 - -#### find(*args): - -##### 示例 - - _orm = orm.find('All').end() - print(_orm) - - _orm = orm.find('title','selects').where(index='>>3').end() - print(_orm) - -##### 返回结果 - - SELECT `index`,`title`,`selects`,`success` FROM `demo_table` - [{'index': 1, 'title': 'test', 'selects': 'selects', 'success': 'false'}, - {'index': 2, 'title': 'test', 'selects': 'selects', 'success': 'false'}, - ....] - SELECT `title`,`selects` FROM `demo_table` WHERE `index`>'3' - [{'title': '100', 'selects': 'selects'}, - {'title': '100', 'selects': 'selects'}, - ....] - -##### 示例解释 - -调用`find()`方法传入`all`关键字为查询所有数据 -调用`find()`方法传入字段名为查询指定字段的所有数据 -调用`find().where()`方法传入字段名为查询指定字段并且满足条件的所有数据 - -### 复杂 - -#### order_by(**args): - -#### desc(): - -#### limit(star=0,end=None): - -#### order_by(**args): - -#### 以上复杂方法使用同一案例解释: - -##### 示例代码 - - 多条 - _orm = orm.find('title', 'selects').where(index='>>1').order_by('index', 'title').desc().limit(star=0, end=3).end() - print(_orm) - 单条 - _orm = orm.find('title', 'selects').where(index='>>1').order_by('index', 'title').desc().limit(star=1).end() - print(_orm) - -##### 返回结果 - - 结果1 - SELECT `title`,`selects` FROM `demo_table` WHERE `index`>'1' ORDER BY `index` AND `title` DESC LIMIT 0,3 - [{'title': '1', 'selects': 'selects'}, {'title': '1', 'selects': 'selects'}, {'title': '1', 'selects': 'selects'}] - - 结果2 - SELECT `title`,`selects` FROM `demo_table` WHERE `index`>'1' ORDER BY `index` AND `title` DESC LIMIT 1 - [{'title': '1', 'selects': 'selects'}] - -##### 示例解释 - - 此ORM采用类似原生sql的方式执行对数据库表的操做,一切以你定义的POJO和对应的数据库表为标准。 - 如果你使用过sql,那么一定也看得懂这类操做 - -#### end(): - - 表示本次操做已结束,可交付框架执行并返回其对应的数据: - - POJO对象 - - 受影响行数,末尾行ID - -##### 示例 - - _orm = orm.find('All').end() - -#### run(): - - 表示本次操做已结束,可交付框架执行并返回其对应的数据: - - POJO对象 - - 受影响行数,末尾行ID - -##### 示例 - - _orm = orm.find('All') - +result = _orm.run() - ## 考虑到安全问题 考虑到安全问题,此ORM不提供以任何形式的 `truncate` 操做 diff --git a/test/test.py b/test/test.py index 10583bb..588891c 100644 --- a/test/test.py +++ b/test/test.py @@ -16,12 +16,10 @@ class ConF(Config.config): user='root', password='123456', charset='utf8'): - conf = { - "print_sql": True, - "last_id": True, - } + self.set_field('print_sql', True) + self.set_field('last_id', True) - super(ConF, self).__init__(host, port, database, user, password, charset, conf=conf) + super(ConF, self).__init__(host, port, database, user, password, charset) def Before(**kwargs): @@ -33,7 +31,7 @@ def After(*args, **kwargs): print('Result:', kwargs) -@Table(name="demo_table", msg="demo message") +# @Table(name="demo_table", msg="demo message") class demo_table(Manage.Pojo): def __init__(self, **kwargs): self.t_id = Manage.tag.intField(primary_key=True) @@ -43,7 +41,7 @@ class demo_table(Manage.Pojo): self.create_time = Manage.tag.datetimeField(auto_time=True) self.update_time = Manage.tag.datetimeField(update_auto_time=True) - super(demo_table, self).__init__(config_obj=ConF(), close_log=True, **kwargs) + super(demo_table, self).__init__(config_obj=ConF(), **kwargs) @AopModel(before=Before, before_kwargs={'1': '1'}, after=After) def find_title_and_selects(self, **kwargs): @@ -52,23 +50,20 @@ class demo_table(Manage.Pojo): print(_r) return _r - @Select(sql='SELECT * FROM demo_table WHERE t_id=%s', params=[1]) - class find_all_where_tid(Manage.Operation): - def __init__(self, t_id): + @Select(sql="SELECT COUNT(*) FROM demo_table WHERE t_id<=%s AND t_msg like %s", params=[10, '${t_msg}']) + class find_all_where_tid_and_t_msg: + def __init__(self, t_id, t_msg): self.t_id = t_id - - def meta(self): - return demo_table() + self.t_msg = t_msg + self.meta = demo_table def setData(): - a = [] - h = demo_table() - for i in range(1000): - h = demo_table(t_name='{}{}'.format('测试name', i), t_pwd='{}{}'.format('测试pwd', i), - t_msg='{}{}'.format('测试msg', i)) + end = demo_table().orm.find().order_by('t_id').desc().limit(1).first().end() + for i in range(end.t_id, 100000 * end.t_id): + demo_table(t_name='{}{}'.format('测试name', i), t_pwd='{}{}'.format('测试pwd', i), + t_msg='{}{}'.format('测试msg', i)).save() # a.append(h) - h.save() # _result = testClass.insert_one(pojo=h) # _r = demo_table().orm.insert(h).end() # h.insert_many(pojo_list=a) @@ -82,34 +77,10 @@ data_count = 0 def th(): def A(): for i in range(100): - d = demo_table() - a = d.find_sql(sql='SELECT * FROM demo_table') - global data_count - data_count += len(a) - - def B(): - for i in range(100): - b = demo_table().find_many(sql='SELECT * FROM demo_table') - global data_count - data_count += len(b) - - def C(): - for i in range(100): - c = demo_table().find_all() - global data_count - data_count += len(c) - - def D(): - for i in range(100): - d = demo_table().find_by_field('title', 'selects') - global data_count - data_count += len(d) + demo_table(t_name='test_name', t_pwd='123', t_msg='123').save() - _a = threading.Thread(target=A) - _b = threading.Thread(target=B) - _c = threading.Thread(target=C) - _d = threading.Thread(target=D) - return _a, _b, _c, _d + a = threading.Thread(target=A) + return a if __name__ == '__main__': @@ -126,13 +97,16 @@ if __name__ == '__main__': # print('data count:', data_count) # print('average:', data_count / (t2 - t1)) d = demo_table() + f = d.__fields__ + result = d.find_all_where_tid_and_t_msg(t_id=10, t_msg='%测试msg%') + print(result) # u = uuid.uuid1() # result = d.find_title_and_selects(uid=u) # print(JsonUtil.parse(result, True)) # a = d.find_all_where_tid(1).run() # print(a) - re = d.orm.find('t_id', 't_name', 't_pwd').where(t_id="<<10").first().end() - print(re.to_json(True)) + # re = d.orm.find('t_id', 't_name', 't_pwd').where(t_id="<<10").first().end() + # print(re.to_json(True)) # d.before_find_title_and_selects(*d.before_args_find_title_and_selects, # **d.before_kwargs_find_title_and_selects) # _r = d.orm.update().set(success='true').where(index=17034).end() -- Gitee From c942ef6944202644dca01534c004eda87a6da3b3 Mon Sep 17 00:00:00 2001 From: CACode <54068986+cctvadmin@users.noreply.github.com> Date: Sun, 25 Apr 2021 10:03:18 +0800 Subject: [PATCH 11/21] =?UTF-8?q?'=E5=88=A0=E9=99=A4e=5Fexcept=E7=B1=BB?= =?UTF-8?q?=EF=BC=8C=E5=85=A8=E5=B1=80=E4=BD=BF=E7=94=A8CACodeLog=E7=B1=BB?= =?UTF-8?q?=E6=97=A5=E5=BF=97'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit '删除e_except类,全局使用CACodeLog类日志' --- CACodeFramework/opera/obj_dict.py | 3 +-- CACodeFramework/util/DbUtil.py | 7 +++---- CACodeFramework/util/Log.py | 21 +++++++++++++++------ 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/CACodeFramework/opera/obj_dict.py b/CACodeFramework/opera/obj_dict.py index 7a64533..3f8691f 100644 --- a/CACodeFramework/opera/obj_dict.py +++ b/CACodeFramework/opera/obj_dict.py @@ -1,8 +1,7 @@ import copy import sys -from CACodeFramework.exception import e_except -from CACodeFramework.field import e_fields +from CACodeFramework.exception import e_fields from CACodeFramework.util.ParseUtil import ParseUtil diff --git a/CACodeFramework/util/DbUtil.py b/CACodeFramework/util/DbUtil.py index 3d3fb61..000cd14 100644 --- a/CACodeFramework/util/DbUtil.py +++ b/CACodeFramework/util/DbUtil.py @@ -4,8 +4,7 @@ from CACodeFramework.util.Log import CACodeLog from dbutils.pooled_db import PooledDB import pymysql -from CACodeFramework.exception import e_except -from CACodeFramework.field import e_fields +from CACodeFramework.exception import e_fields def parse_kwa(db, **kwargs): @@ -27,8 +26,8 @@ def parse_kwa(db, **kwargs): sql = kwargs['sql'] if 'print_sql' in kwargs.keys() and kwargs['print_sql'] is True: _l = sys._getframe().f_back.f_lineno - e_except.warn(obj=db, line=_l, task_name='Print Sql', f_warn=e_fields.INFO, msg=sql) - CACodeLog.log(_obj=db, msg='Being Initialize this object') + CACodeLog.log(obj=db, line=_l, task_name='Print Sql', msg=sql) + CACodeLog.log(obj=db, msg='Being Initialize this object') cursor.execute(sql) return cursor except Exception as e: diff --git a/CACodeFramework/util/Log.py b/CACodeFramework/util/Log.py index 5a37557..e1ea657 100644 --- a/CACodeFramework/util/Log.py +++ b/CACodeFramework/util/Log.py @@ -1,9 +1,10 @@ import os import sys import time +import warnings +from datetime import datetime -from CACodeFramework.exception import e_except -from CACodeFramework.field import e_fields +from CACodeFramework.exception import e_fields def date_format(time_obj=time, fmt='%Y-%m-%d %H:%M:%S'): @@ -70,7 +71,7 @@ class CACodeLog(object): self.save_flag = save_flag @staticmethod - def log(_obj, msg, name='\t\tTask', LogObject=None): + def log(obj, msg, line=sys._getframe().f_back.f_lineno, task_name='\t\tTask', LogObject=None): """ 输出任务执行日志 @@ -80,10 +81,18 @@ class CACodeLog(object): :param LogObject:写出文件的对象 """ - # 获得该函数被调用前的行号 - _l = sys._getframe().f_back.f_lineno # 格式:时间 类型 日志名称 对象地址 被调用行号 执行类型 信息 - info = e_except.warn(obj=_obj, line=_l, task_name=name, f_warn=e_fields.INFO, msg=msg, LogObject=LogObject) + t = datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3] + info = '{} {} {} [{}] [{}] [{}] \t\t\t:{}'.format(t, e_fields.INFO, + e_fields.LOG_OPERA_NAME, + id(obj), + obj.__str__(), + task_name, + msg) + # 输出日志信息 + warnings.warn_explicit(info, category=Warning, filename='line', lineno=line) + if LogObject is not None: + LogObject.warn(info) return info def success(self, content): -- Gitee From 164212130c4036ce27ed8399cb56d0b89910011f Mon Sep 17 00:00:00 2001 From: CACode <54068986+cctvadmin@users.noreply.github.com> Date: Sun, 25 Apr 2021 10:06:03 +0800 Subject: [PATCH 12/21] =?UTF-8?q?=E5=88=A0=E9=99=A4e=5Fexcept=E7=B1=BB?= =?UTF-8?q?=EF=BC=8C=E5=85=A8=E5=B1=80=E4=BD=BF=E7=94=A8CACodeLog=E7=B1=BB?= =?UTF-8?q?=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 删除e_except类,全局使用CACodeLog类日志 --- CACodeFramework/opera/obj_dict.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CACodeFramework/opera/obj_dict.py b/CACodeFramework/opera/obj_dict.py index 3f8691f..64fed0a 100644 --- a/CACodeFramework/opera/obj_dict.py +++ b/CACodeFramework/opera/obj_dict.py @@ -2,6 +2,7 @@ import copy import sys from CACodeFramework.exception import e_fields +from CACodeFramework.util.Log import CACodeLog from CACodeFramework.util.ParseUtil import ParseUtil @@ -20,7 +21,7 @@ class parses(object): # 获得该函数被调用前的行号 _l = sys._getframe().f_back.f_lineno # 格式:时间 类型 日志名称 对象地址 被调用行号 执行类型 信息 - info = e_except.warn(obj=_obj, line=_l, task_name=name, f_warn=e_fields.INFO, msg=msg, LogObject=LogObject) + info = CACodeLog.log(obj=_obj, line=_l, task_name=name, msg=msg, LogObject=LogObject) def last_id(self, **kwargs): """作者:CACode 最后编辑于2021/4/12 -- Gitee From e61f9d4c6ed8a0847d59d941f7ca8ba9e8ca60b3 Mon Sep 17 00:00:00 2001 From: CACode <54068986+cctvadmin@users.noreply.github.com> Date: Sun, 25 Apr 2021 18:16:29 +0800 Subject: [PATCH 13/21] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=96=87=E4=BB=B6=EF=BC=8C=E7=AD=89=E5=BE=85=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?anno=E6=B3=A8=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CACodeFramework/MainWork/CACodePureORM.py | 2 +- CACodeFramework/anno/annos.py | 1 + CACodeFramework/field/sql_fields.py | 50 ++++++++++++----------- CACodeFramework/opera/obj_dict.py | 32 --------------- CACodeFramework/opera/op_db.py | 7 ++-- CACodeFramework/util/Log.py | 4 +- CACodeFramework/util/ParseUtil.py | 21 ++++++++++ test/test.py | 8 ++-- 8 files changed, 59 insertions(+), 66 deletions(-) diff --git a/CACodeFramework/MainWork/CACodePureORM.py b/CACodeFramework/MainWork/CACodePureORM.py index 2bae367..7e47952 100644 --- a/CACodeFramework/MainWork/CACodePureORM.py +++ b/CACodeFramework/MainWork/CACodePureORM.py @@ -305,7 +305,7 @@ class CACodePureORM(object): ) _result_objs = [] for i in _result: - _obj = self.parses.parse_obj(data=i, participants=self.repository.participants) + _obj = ParseUtil.parse_obj(data=i, instance=self.repository.participants) _result_objs.append(_obj) _result = _result_objs else: diff --git a/CACodeFramework/anno/annos.py b/CACodeFramework/anno/annos.py index d68949c..8744ffe 100644 --- a/CACodeFramework/anno/annos.py +++ b/CACodeFramework/anno/annos.py @@ -1,3 +1,4 @@ +import re import types from functools import wraps diff --git a/CACodeFramework/field/sql_fields.py b/CACodeFramework/field/sql_fields.py index 39fe09a..fa3db64 100644 --- a/CACodeFramework/field/sql_fields.py +++ b/CACodeFramework/field/sql_fields.py @@ -1,46 +1,52 @@ # 所有常量以空格开头并且以空格结束 # 空格符 space = ' ' + + +def parse_field(key: str) -> str: + return space + key + space + + # 角标 subscript = '`' # 插入 -insert_str = space + 'INSERT INTO' + space +insert_str = parse_field('INSERT INTO') # 删除 -delete_str = space + 'DELETE' + space +delete_str = parse_field('DELETE') # 修改 -update_str = space + 'UPDATE' + space +update_str = parse_field('UPDATE') # 查找 -find_str = space + 'SELECT' + space +find_str = parse_field('SELECT') # 当 -where_str = space + 'WHERE' + space +where_str = parse_field('WHERE') # 根据 -by_str = space + 'BY' + space +by_str = parse_field('BY') # 根据排序 -order_by_str = space + 'ORDER BY' + space +order_by_str = parse_field('ORDER BY') # 根据 -group_by_str = space + 'GROUP BY' + space +group_by_str = parse_field('GROUP BY') # 倒叙 -desc_str = space + 'DESC' + space +desc_str = parse_field('DESC') # 设置 -set_str = space + 'SET' + space +set_str = parse_field('SET') # 和 -ander_str = space + 'AND' + space +ander_str = parse_field('AND') # 分页 -limit_str = space + 'LIMIT' + space +limit_str = parse_field('LIMIT') # 从 -from_str = space + 'FROM' + space +from_str = parse_field('FROM') # 值 -value_str = space + 'VALUE' + space +value_str = parse_field('VALUE') # 多个值 -values_str = space + 'VALUES' + space +values_str = parse_field('VALUES') # as -asses_str = space + 'as' + space +asses_str = parse_field('as') # 运算符 symbol = '>> << == <= >= != - + / * %'.split(' ') -left_par = space + '(' + space -right_par = ')' -comma = ',' -eq = '=' +left_par = parse_field('(') +right_par = parse_field(')') +comma = parse_field(',') +eq = parse_field('=') def parse_set(keys): @@ -52,7 +58,3 @@ def parse_set(keys): keys_str += '{}=%s{}'.format(i, ander_str) keys_str = keys_str[0:len(keys_str) - len(ander_str)] return keys_str - - -if __name__ == '__main__': - print(parse_set(['title', 'selects'])) diff --git a/CACodeFramework/opera/obj_dict.py b/CACodeFramework/opera/obj_dict.py index 64fed0a..ca09cea 100644 --- a/CACodeFramework/opera/obj_dict.py +++ b/CACodeFramework/opera/obj_dict.py @@ -1,8 +1,3 @@ -import copy -import sys - -from CACodeFramework.exception import e_fields -from CACodeFramework.util.Log import CACodeLog from CACodeFramework.util.ParseUtil import ParseUtil @@ -11,18 +6,6 @@ class parses(object): self.args = args self.kwargs = kwargs - def log(self, _obj, msg, name='\t\tTask', LogObject=None): - """ - 输出任务执行日志 - - :param _obj:任务对象的值 - - """ - # 获得该函数被调用前的行号 - _l = sys._getframe().f_back.f_lineno - # 格式:时间 类型 日志名称 对象地址 被调用行号 执行类型 信息 - info = CACodeLog.log(obj=_obj, line=_l, task_name=name, msg=msg, LogObject=LogObject) - def last_id(self, **kwargs): """作者:CACode 最后编辑于2021/4/12 @@ -96,18 +79,3 @@ class parses(object): keys_copy.append(keys[i]) cp_value.append(j) return ParseUtil().parse_insert(keys_copy, cp_value, __table_name__) - - def parse_obj(self, data: dict, participants): - """ - 将数据解析成对象 - 注意事项: - 数据来源必须是DbUtil下查询出来的 - :param data:单行数据 - :param participants:参与解析的对象 - :return:POJO对象 - """ - # 深度复制对象 - part_obj = copy.copy(participants) - for key, value in data.items(): - setattr(part_obj, key, value) - return part_obj diff --git a/CACodeFramework/opera/op_db.py b/CACodeFramework/opera/op_db.py index a7a4d43..afd91a5 100644 --- a/CACodeFramework/opera/op_db.py +++ b/CACodeFramework/opera/op_db.py @@ -30,7 +30,8 @@ class DbOperation(object): _lock = kwargs['t_local'] name = kwargs['__task_uuid__'] if not _lock.close_log: - CACodeLog.log(_obj=kwargs['func'], msg='TASK-{} START'.format(name), name=name, LogObject=kwargs['log_obj']) + CACodeLog.log(obj=kwargs['func'], msg='TASK-{} START'.format(name), task_name=name, + LogObject=kwargs['log_obj']) # # 设置任务 # _kw = JsonUtil.load(JsonUtil.parse(_lock)) _kw = _lock.__dict__ @@ -38,7 +39,7 @@ class DbOperation(object): _t = threading.Thread(target=func, args=args, kwargs=kwargs, name=name) _t.start() if not _lock.close_log: - CACodeLog.log(_obj=_t, msg='TASK-{} RUNNING'.format(name), name=name, LogObject=kwargs['log_obj']) + CACodeLog.log(obj=_t, msg='TASK-{} RUNNING'.format(name), task_name=name, LogObject=kwargs['log_obj']) # 等待任务完成 _t.join() # 返回结果 @@ -86,7 +87,7 @@ class DbOperation(object): self.result = [] for i in _rs: - self.result.append(self.parse_util.parse_obj(i, kwargs['participants'])) + self.result.append(ParseUtil.parse_obj(i, kwargs['participants'])) return self.result diff --git a/CACodeFramework/util/Log.py b/CACodeFramework/util/Log.py index e1ea657..e2e2679 100644 --- a/CACodeFramework/util/Log.py +++ b/CACodeFramework/util/Log.py @@ -75,9 +75,9 @@ class CACodeLog(object): """ 输出任务执行日志 - :param _obj:执行日志的对象地址 + :param obj:执行日志的对象地址 :param msg:消息 - :param name:任务对象的值 + :param task_name:任务对象的值 :param LogObject:写出文件的对象 """ diff --git a/CACodeFramework/util/ParseUtil.py b/CACodeFramework/util/ParseUtil.py index 181d097..f82061d 100644 --- a/CACodeFramework/util/ParseUtil.py +++ b/CACodeFramework/util/ParseUtil.py @@ -1,6 +1,11 @@ +import copy + from CACodeFramework.field.sql_fields import * +# from CACodeFramework.pojoManager.Manage import Pojo + + def parse_main(*args, to_str=False, is_field=False): """ 解析属性: @@ -104,3 +109,19 @@ class ParseUtil(object): args.append(i) kes['params'] = args return kes + + @staticmethod + def parse_obj(data: dict, instance: object) -> object: + """ + 将数据解析成对象 + 注意事项: + 数据来源必须是DbUtil下查询出来的 + :param data:单行数据 + :param instance:参与解析的对象 + :return:POJO对象 + """ + # 深度复制对象 + part_obj = copy.copy(instance) + for key, value in data.items(): + setattr(part_obj, key, value) + return part_obj diff --git a/test/test.py b/test/test.py index 10583bb..91d5440 100644 --- a/test/test.py +++ b/test/test.py @@ -113,7 +113,7 @@ def th(): if __name__ == '__main__': - # setData() + setData() # c = demo_table().orm.find('count(*)', asses=['c'], h_func=True).end()[0] # print('count:', c.c) # t1 = time.time() @@ -125,14 +125,14 @@ if __name__ == '__main__': # print('time:', t2 - t1) # print('data count:', data_count) # print('average:', data_count / (t2 - t1)) - d = demo_table() + # d = demo_table() # u = uuid.uuid1() # result = d.find_title_and_selects(uid=u) # print(JsonUtil.parse(result, True)) # a = d.find_all_where_tid(1).run() # print(a) - re = d.orm.find('t_id', 't_name', 't_pwd').where(t_id="<<10").first().end() - print(re.to_json(True)) + # re = d.orm.find('t_id', 't_name', 't_pwd').where(t_id="<<10").first().end() + # print(re.to_json(True)) # d.before_find_title_and_selects(*d.before_args_find_title_and_selects, # **d.before_kwargs_find_title_and_selects) # _r = d.orm.update().set(success='true').where(index=17034).end() -- Gitee From 7130f0302abb8837d3eb50002ed9855a269e5ea7 Mon Sep 17 00:00:00 2001 From: CACode Date: Sun, 25 Apr 2021 22:26:26 +0800 Subject: [PATCH 14/21] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=B5=8B=E8=AF=95,?= =?UTF-8?q?=E5=88=A0=E9=99=A4run=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CACodeFramework/pojoManager/Manage.py | 3 --- test/test.py | 28 +++------------------------ 2 files changed, 3 insertions(+), 28 deletions(-) diff --git a/CACodeFramework/pojoManager/Manage.py b/CACodeFramework/pojoManager/Manage.py index aa0ebff..6016aa6 100644 --- a/CACodeFramework/pojoManager/Manage.py +++ b/CACodeFramework/pojoManager/Manage.py @@ -86,6 +86,3 @@ class Operation(metaclass=ABCMeta): @abstractmethod def meta(self): pass - - def run(self): - return self.result diff --git a/test/test.py b/test/test.py index 91d5440..ed3045c 100644 --- a/test/test.py +++ b/test/test.py @@ -52,7 +52,7 @@ class demo_table(Manage.Pojo): print(_r) return _r - @Select(sql='SELECT * FROM demo_table WHERE t_id=%s', params=[1]) + @Select(sql='SELECT * FROM demo_table WHERE t_id=%s', params=['${t_id}']) class find_all_where_tid(Manage.Operation): def __init__(self, t_id): self.t_id = t_id @@ -113,27 +113,5 @@ def th(): if __name__ == '__main__': - setData() - # c = demo_table().orm.find('count(*)', asses=['c'], h_func=True).end()[0] - # print('count:', c.c) - # t1 = time.time() - # t = th() - # for i in t: - # i.start() - # i.join() - # t2 = time.time() - # print('time:', t2 - t1) - # print('data count:', data_count) - # print('average:', data_count / (t2 - t1)) - # d = demo_table() - # u = uuid.uuid1() - # result = d.find_title_and_selects(uid=u) - # print(JsonUtil.parse(result, True)) - # a = d.find_all_where_tid(1).run() - # print(a) - # re = d.orm.find('t_id', 't_name', 't_pwd').where(t_id="<<10").first().end() - # print(re.to_json(True)) - # d.before_find_title_and_selects(*d.before_args_find_title_and_selects, - # **d.before_kwargs_find_title_and_selects) - # _r = d.orm.update().set(success='true').where(index=17034).end() - # print(_r) + result = demo_table().find_all_where_tid(t_id=10, first=True) + print(result) -- Gitee From dbf7f59a0496a1b189fb621ad61464e9c3c7b770 Mon Sep 17 00:00:00 2001 From: CACode Date: Mon, 26 Apr 2021 00:39:01 +0800 Subject: [PATCH 15/21] =?UTF-8?q?=E6=96=B0=E5=A2=9EQuerySet=E6=8F=90?= =?UTF-8?q?=E4=BE=9B=E5=BA=8F=E5=88=97=E5=8C=96=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CACodeFramework/anno/annos.py | 17 +++++---- CACodeFramework/cacode/__init__.py | 0 CACodeFramework/cacode/serialize.py | 55 +++++++++++++++++++++++++++ CACodeFramework/opera/obj_dict.py | 13 ++++--- CACodeFramework/opera/op_db.py | 4 +- CACodeFramework/pojoManager/Manage.py | 12 +++++- CACodeFramework/util/JsonUtil.py | 35 +++++++---------- CACodeFramework/util/Log.py | 2 +- test/test.py | 6 +-- 9 files changed, 104 insertions(+), 40 deletions(-) create mode 100644 CACodeFramework/cacode/__init__.py create mode 100644 CACodeFramework/cacode/serialize.py diff --git a/CACodeFramework/anno/annos.py b/CACodeFramework/anno/annos.py index 04f0ccc..e7beee0 100644 --- a/CACodeFramework/anno/annos.py +++ b/CACodeFramework/anno/annos.py @@ -1,4 +1,7 @@ import re +import inspect + +from CACodeFramework.cacode.serialize import QuerySet def Table(name, msg, **kwargs): @@ -34,7 +37,11 @@ def parse_kwargs(params, pattern, kwargs): return new_args -def Select(sql, params=None, print_sql=False, first=False): +def first_func(): + return inspect.stack() + + +def Select(sql, params=None): def base_func(cls): def _wrapper_(*args, **kwargs): l = list(args) @@ -44,13 +51,9 @@ def Select(sql, params=None, print_sql=False, first=False): new_args = parse_kwargs(params, r'^\${.*}$', kwargs) - result = obj.find_sql(sql=sql, params=new_args, print_sql=print_sql) - # setattr(cls_obj, 'result', result) - if first: - if type(result) is list and len(result) != 0: - result = result[0] + result = obj.find_sql(sql=sql, params=new_args) - return result + return QuerySet(obj, result) return _wrapper_ diff --git a/CACodeFramework/cacode/__init__.py b/CACodeFramework/cacode/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/CACodeFramework/cacode/serialize.py b/CACodeFramework/cacode/serialize.py new file mode 100644 index 0000000..cc3b132 --- /dev/null +++ b/CACodeFramework/cacode/serialize.py @@ -0,0 +1,55 @@ +import copy + +from CACodeFramework.util import JsonUtil + + +def list_of_groups(init_list, size): + lo_groups = zip(*(iter(init_list),) * size) + end_list = [list(i) for i in lo_groups] + count = len(init_list) % size + end_list.append(init_list[-count:]) if count != 0 else end_list + return end_list + + +class QuerySet(list): + + def __init__(self, instance, base_data: list): + list.__init__([]) + self.__instance__ = instance + for i in base_data: + self.append(i) + + def first(self): + """ + 取得结果集的第一位参数 + """ + return self[0] + + def last(self): + """ + 取得结果集的最后一位参数 + """ + return self[len(self) - 1] + + def page(self, size): + """ + 将结果集按照指定数目分割 + """ + return list_of_groups(self, size) + + def to_json(self): + this_dict = JsonUtil.parse(obj=self, end_load=True) + result = [] + show_fields = self.__instance__.__fields__ + for i, v in enumerate(this_dict): + children = {} + for sf in show_fields: + if sf in v.keys(): + children[sf] = this_dict[i][sf] + + result.append(children) + + return JsonUtil.parse(obj=result) + + def __str__(self): + return JsonUtil.parse(self) diff --git a/CACodeFramework/opera/obj_dict.py b/CACodeFramework/opera/obj_dict.py index ca09cea..78b876d 100644 --- a/CACodeFramework/opera/obj_dict.py +++ b/CACodeFramework/opera/obj_dict.py @@ -1,3 +1,4 @@ +from CACodeFramework.pojoManager import Manage from CACodeFramework.util.ParseUtil import ParseUtil @@ -29,8 +30,9 @@ class parses(object): """ conf_obj = kwargs['config_obj'] if 'last_id' not in kwargs.keys(): - if 'last_id' in conf_obj.conf.keys(): - kwargs['last_id'] = conf_obj.conf['last_id'] + c_dict = conf_obj.get_dict() + if 'last_id' in c_dict.keys(): + kwargs['last_id'] = c_dict['last_id'] else: kwargs['last_id'] = False return kwargs @@ -49,8 +51,9 @@ class parses(object): """ conf_obj = kwargs['config_obj'] if 'print_sql' not in kwargs.keys(): - if 'print_sql' in conf_obj.conf.keys(): - kwargs['print_sql'] = conf_obj.conf['print_sql'] + c_dict = conf_obj.get_dict() + if 'print_sql' in c_dict.keys(): + kwargs['print_sql'] = c_dict['print_sql'] else: kwargs['print_sql'] = False return kwargs @@ -75,7 +78,7 @@ class parses(object): values = [getattr(pojo, v) for v in keys] for i, j in enumerate(values): - if j is not None and not pojo.is_default(j): + if j is not None and not Manage.Pojo.is_default(j): keys_copy.append(keys[i]) cp_value.append(j) return ParseUtil().parse_insert(keys_copy, cp_value, __table_name__) diff --git a/CACodeFramework/opera/op_db.py b/CACodeFramework/opera/op_db.py index 354a8f5..235346d 100644 --- a/CACodeFramework/opera/op_db.py +++ b/CACodeFramework/opera/op_db.py @@ -1,5 +1,6 @@ import threading +from CACodeFramework.cacode.serialize import QuerySet from CACodeFramework.util.Log import CACodeLog from CACodeFramework.opera.obj_dict import parses @@ -43,7 +44,8 @@ class DbOperation(object): # 等待任务完成 _t.join() # 返回结果 - return self.result + resultSet = QuerySet(instance=kwargs['participants'], base_data=self.result) + return resultSet def __find_all__(self, *args, **kwargs): """作者:CACode 最后编辑于2021/4/12 diff --git a/CACodeFramework/pojoManager/Manage.py b/CACodeFramework/pojoManager/Manage.py index 3e8b097..6e1d2e9 100644 --- a/CACodeFramework/pojoManager/Manage.py +++ b/CACodeFramework/pojoManager/Manage.py @@ -61,7 +61,8 @@ class Pojo(CACodeRepository.Repository): """ return JsonUtil.load(JsonUtil.parse(self)) - def is_default(self, val): + @staticmethod + def is_default(val): """ 是否等于默认值 """ @@ -78,3 +79,12 @@ class Pojo(CACodeRepository.Repository): 转ORM框架 """ return CACodePureORM(self) + + def format(self, key, name): + if 'ig' in self.__fields__.keys(): + self.__fields__['ig'].append({ + key: name + }) + else: + self.__fields__['ig'] = [] + self.format(key, name) diff --git a/CACodeFramework/util/JsonUtil.py b/CACodeFramework/util/JsonUtil.py index 52272bf..593aff0 100644 --- a/CACodeFramework/util/JsonUtil.py +++ b/CACodeFramework/util/JsonUtil.py @@ -27,7 +27,7 @@ class SimplejsonDateEncoder(simplejson.JSONEncoder): return date_encoder(obj) -def parse(obj, bf=False): +def parse(obj, bf=False, end_load=False): """作者:CACode 最后编辑于2021/4/10 将对象转换成字典格式: @@ -39,10 +39,17 @@ def parse(obj, bf=False): object[list] object[list[object]] ....... - Returns: - 返回字典格式 + + 注意事项: + + bf和end_load同时只能使用一个 + + 当两者同时存在时,默认使用end_load功能 + + :param obj:需要解析的对象 :param bf:是否需要美化json + :param end_load:是否需要在最后转成字典格式 """ def json_to_str(_obj): @@ -133,7 +140,9 @@ def parse(obj, bf=False): obj = parse_obj(obj) # 最后的解析结果 result = json_to_str(obj) - if bf: + if end_load: + return load(result) + elif bf: return beautiful(load(result)) return result @@ -171,21 +180,3 @@ def beautiful(_data): 美化json """ return json.dumps(_data, sort_keys=True, indent=4, separators=(',', ':')) - - -if __name__ == '__main__': - a = { - 'a': 1, - 'b': [1, 2, 3], - 'c': { - 'c1': 1, - 'c2': 2, - 'c3': 3, - 'c4': 4 - }, - 'd': 1, - 'e': '1', - 'f': datetime.now() - } - a = parse(a) - print(a) diff --git a/CACodeFramework/util/Log.py b/CACodeFramework/util/Log.py index 89ea5d7..ad1649e 100644 --- a/CACodeFramework/util/Log.py +++ b/CACodeFramework/util/Log.py @@ -94,7 +94,7 @@ class CACodeLog(object): info = '[{}] [\t{}] [{}] [\t{}] [{}] [{}] \t\t\t:{}'.format(t, e_fields.INFO, e_fields.LOG_OPERA_NAME, - id(obj), + hex(id(obj)), obj.__str__(), task_name, msg) diff --git a/test/test.py b/test/test.py index 588891c..562431e 100644 --- a/test/test.py +++ b/test/test.py @@ -97,9 +97,9 @@ if __name__ == '__main__': # print('data count:', data_count) # print('average:', data_count / (t2 - t1)) d = demo_table() - f = d.__fields__ - result = d.find_all_where_tid_and_t_msg(t_id=10, t_msg='%测试msg%') - print(result) + print(d.find_all().to_json()) + # result = d.find_all_where_tid_and_t_msg(t_id=10, t_msg='%测试msg%').to_json() + # print(result) # u = uuid.uuid1() # result = d.find_title_and_selects(uid=u) # print(JsonUtil.parse(result, True)) -- Gitee From a32fd727a53251c7bd2e3383cd82aa26dc712fb7 Mon Sep 17 00:00:00 2001 From: CACode <54068986+cctvadmin@users.noreply.github.com> Date: Mon, 26 Apr 2021 18:10:15 +0800 Subject: [PATCH 16/21] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BB=93=E5=BA=93?= =?UTF-8?q?=E5=B7=A5=E5=8E=82=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CACodeFramework/MainWork/CACodePureORM.py | 11 +- CACodeFramework/MainWork/CACodeRepository.py | 15 +- CACodeFramework/anno/annos.py | 141 +++++++++++++++- CACodeFramework/anno/aop.py | 154 +++--------------- CACodeFramework/cacode/Factory.py | 102 ++++++++++++ .../cacode/{serialize.py => Serialize.py} | 49 +++++- CACodeFramework/exception/e_fields.py | 7 + CACodeFramework/opera/CompulsoryRun.py | 25 +++ CACodeFramework/opera/obj_dict.py | 84 ---------- CACodeFramework/opera/op_db.py | 18 +- CACodeFramework/pojoManager/Manage.py | 22 +-- CACodeFramework/util/ParseUtil.py | 146 ++++++++++++++++- test/modules/BaseData.py | 8 + test/modules/DatabaseConf.py | 15 ++ test/modules/Demo.py | 41 +++++ test/modules/__init__.py | 0 test/test.py | 113 ------------- test/testFunc.py | 17 ++ 18 files changed, 585 insertions(+), 383 deletions(-) create mode 100644 CACodeFramework/cacode/Factory.py rename CACodeFramework/cacode/{serialize.py => Serialize.py} (55%) create mode 100644 CACodeFramework/opera/CompulsoryRun.py delete mode 100644 CACodeFramework/opera/obj_dict.py create mode 100644 test/modules/BaseData.py create mode 100644 test/modules/DatabaseConf.py create mode 100644 test/modules/Demo.py create mode 100644 test/modules/__init__.py delete mode 100644 test/test.py create mode 100644 test/testFunc.py diff --git a/CACodeFramework/MainWork/CACodePureORM.py b/CACodeFramework/MainWork/CACodePureORM.py index a97b463..a1b247d 100644 --- a/CACodeFramework/MainWork/CACodePureORM.py +++ b/CACodeFramework/MainWork/CACodePureORM.py @@ -1,6 +1,6 @@ # 纯净ORM +from CACodeFramework.cacode.Serialize import QuerySet from CACodeFramework.exception import e_fields -from CACodeFramework.opera import obj_dict, op_db from CACodeFramework.util.Log import CACodeLog from CACodeFramework.util.ParseUtil import ParseUtil @@ -23,14 +23,12 @@ class CACodePureORM(object): 初始化ORM :param repository:仓库 """ - self.parses = op_db.parses() self.args = [] self.params = [] if repository is None: - raise SyntaxError('') + CACodeLog.err(AttributeError, 'Repository is null,Place use repository of ORM framework') self.repository = repository self.__table_name__ = '{}{}{}'.format(subscript, repository.__table_name__, subscript) - self.parses = obj_dict.parses() self.first_data = False @@ -54,7 +52,7 @@ class CACodePureORM(object): # 添加insert关键字 # self.args.append(insert_str) # self.args.append('{}{}'.format(self.__table_name__, left_par)) - sql = obj_dict.parses().parse_insert(pojo, self.__table_name__.replace('`', '')) + sql = ParseUtil.parse_insert_pojo(pojo, self.__table_name__.replace('`', '')) self.args.append(sql['sql']) self.params = sql['params'] @@ -330,7 +328,8 @@ class CACodePureORM(object): if type(_result) is list or type(_result) is tuple: return _result[0] else: - return _result + q = QuerySet(instance=self.repository.participants, base_data=_result) + return q def con_from(self): """ diff --git a/CACodeFramework/MainWork/CACodeRepository.py b/CACodeFramework/MainWork/CACodeRepository.py index 6fc50e8..7f8e16e 100644 --- a/CACodeFramework/MainWork/CACodeRepository.py +++ b/CACodeFramework/MainWork/CACodeRepository.py @@ -11,6 +11,8 @@ import threading import uuid # threadLocal 避免线程干扰 +from CACodeFramework.util.ParseUtil import ParseUtil + t_local = threading.local() @@ -73,7 +75,6 @@ class Repository(object): self.close_log = close_log self.__table_name__ = self.__table_name__ self.operation = op_db.DbOperation() - self.parse = op_db.parses() if not self.close_log: CACodeLog.log(obj=self, msg='Being Initialize this object') # 模板类 @@ -250,8 +251,8 @@ class Repository(object): :return: """ kwargs['config_obj'] = t_local.config_obj - kwargs = self.parse.print_sql(**kwargs) - kwargs = self.parse.last_id(**kwargs) + kwargs = ParseUtil.print_sql(**kwargs) + kwargs = ParseUtil.last_id(**kwargs) return t_local.db_util.update(**kwargs) def insert_sql(self, **kwargs): @@ -264,8 +265,8 @@ class Repository(object): params:需要填充的字段 :return rowcount,last_id if last_id=True """ - kwargs = self.parse.print_sql(**kwargs) - kwargs = self.parse.last_id(**kwargs) + kwargs = ParseUtil.print_sql(**kwargs) + kwargs = ParseUtil.last_id(**kwargs) return self.db_util.insert(**kwargs) def save(self, **kwargs): @@ -306,8 +307,8 @@ class Repository(object): :return:list[rowcount,last_id if last_id=True] """ kwargs['config_obj'] = t_local.config_obj - kwargs = self.parse.print_sql(**kwargs) - kwargs = self.parse.last_id(**kwargs) + kwargs = ParseUtil.print_sql(**kwargs) + kwargs = ParseUtil.last_id(**kwargs) t_local._result = [] for item in kwargs['pojo_list']: kwargs['pojo'] = item diff --git a/CACodeFramework/anno/annos.py b/CACodeFramework/anno/annos.py index e7beee0..7932fc8 100644 --- a/CACodeFramework/anno/annos.py +++ b/CACodeFramework/anno/annos.py @@ -1,7 +1,8 @@ import re import inspect -from CACodeFramework.cacode.serialize import QuerySet +from CACodeFramework.anno.aop import AopModelObject +from CACodeFramework.cacode.Serialize import QuerySet def Table(name, msg, **kwargs): @@ -22,18 +23,19 @@ def Table(name, msg, **kwargs): return set_to_field -def parse_kwargs(params, pattern, kwargs): +def parse_kwargs(params, kwargs): """ 通过${key}方式解析特殊字段 """ new_args = [] for i in params: - context = re.match(pattern, str(i)) + context = re.findall(r'{(.*?)}', str(i)) if context: - key = str(context.string).replace('${', '').replace('}', '') - new_args.append(kwargs[key]) + for con in context: + new_args.append(kwargs[con]) else: new_args.append(i) + return new_args @@ -42,6 +44,22 @@ def first_func(): def Select(sql, params=None): + """ + 快捷的查询装饰器 + + 使用此装饰器,可以将大量重复代码继承到此装饰器内部实现 + + 使用方法: + @Select(sql="SELECT * FROM demo_table WHERE t_id<=%s AND t_msg like %s", params=['${t_id}', '%${t_msg}%']) + + sql:执行的sql语句,需要加密的参数使用`%s`表示 + + params:加密参数的内容,标记使用传参请使用`${字段名}`表示 + + + + """ + def base_func(cls): def _wrapper_(*args, **kwargs): l = list(args) @@ -49,7 +67,7 @@ def Select(sql, params=None): cls_obj = cls(*l, **kwargs) obj = cls_obj.meta() - new_args = parse_kwargs(params, r'^\${.*}$', kwargs) + new_args = parse_kwargs(params, kwargs) result = obj.find_sql(sql=sql, params=new_args) @@ -58,3 +76,114 @@ def Select(sql, params=None): return _wrapper_ return base_func + + +def AopModel(before=None, after=None, + before_args=None, before_kwargs=None, + after_args=None, after_kwargs=None): + """ + + AOP切面模式: + 依赖AopModel装饰器,再在方法上加入@AopModel即可切入编程 + + + 优点: + + 当使用@AopModel时,内部函数将会逐级调用回调函数,执行循序是: + - func(*self.args, **self.kwargs) + - func(*self.args) + - func(**self.kwargs) + - func() + 这将意味着,如果你的参数传入错误时,AopModel依旧会遵循原始方法所使用的规则,最令人大跌眼镜的使用方法就是: + + def Before(**kwargs): + print('Before:', kwargs) + # 此处的Before方法未存在args参数,而使用@AopModel时却传入了args + @AopModel(before=Before,before_args=(0,1,2), before_kwargs={'1': '1'}) + def find_title_and_selects(self, **kwargs): + + print('function task', kwargs['uid']) + + _r = self.orm.find().where(index="<<100").end() + + print(_r) + + return _r + + 其中包含参数有: + before:切入时需要执行的函数 + + before_args:切入的参数 + 传入的列表或元组类型数据 + 如果是需要使用当前pojo中的内容时,传参格式为:(pojo.字段名) + 可扩展格式,例如需要传入字典 + + before_kwargs:切入的参数 -- 传入的字典数据 + + after:切出前需要执行的参数 + + after_args:切出的参数 + 传入的列表或元组类型数据 + 如果是需要使用当前pojo中的内容时,传参格式为:('self.字段名') + 可扩展格式,例如需要传入字典:('self.dict.key') + + after_kwargs:切出的参数 -- 传入的字典数据 + + + 执行流程: + + Before->original->After + + Before注意事项: + + 使用该参数时,方法具有返回值概不做处理,需要返回值内容可使用`global`定义一个全局字段用于保存数值 + + 当无法解析或者解析失败时m将使用pass关键字忽略操作 + + After注意事项: + + 使用该参数时,必须搭配至少一个result=None的kwargs存在于方法的形参中, + + 当original方法执行完成将把返回值固定使用result键值对注入到该函数中 + + 当无法解析或者解析失败时m将使用pass关键字忽略操作 + + + + Attributes: + + before:切入时需要执行的函数 + + after:切出前需要执行的参数 + + before_args:切入的参数 + 传入的列表或元组类型数据 + 如果是需要使用当前pojo中的内容时,传参格式为:(pojo.字段名) + 可扩展格式,例如需要传入字典 + + before_kwargs:切入的参数 -- 传入的字典数据 + + after_args:切出的参数 + 传入的列表或元组类型数据 + 如果是需要使用当前pojo中的内容时,传参格式为:('self.字段名') + 可扩展格式,例如需要传入字典:('self.dict.key') + + after_kwargs:切出的参数 -- 传入的字典数据 + + + """ + # 得到对象组 + aop_obj = AopModelObject(before, after, + before_args, before_kwargs, + after_args, after_kwargs) + + def base_func(func): + aop_obj.set_func(func) + + def _wrapper_(*args, **kwargs): + aop_obj.set_args(*args, **kwargs) + return aop_obj.start() + + return _wrapper_ + + return base_func diff --git a/CACodeFramework/anno/aop.py b/CACodeFramework/anno/aop.py index bb1d289..6250740 100644 --- a/CACodeFramework/anno/aop.py +++ b/CACodeFramework/anno/aop.py @@ -1,7 +1,9 @@ import types +from CACodeFramework.opera.CompulsoryRun import Compulsory -class AopModel_Object(object): + +class AopModelObject(object): """ 此类为AopModel提供所有操作 """ @@ -223,133 +225,23 @@ class AopModel_Object(object): 最后耍无赖方法返回函数执行的结果 使用四个try逐一抛出 """ - try: - return self.func(*self.args, **self.kwargs) - except TypeError as e: - pass - - try: - return self.func(*self.args) - except TypeError as e: - pass - - try: - return self.func(**self.kwargs) - except TypeError as e: - pass - - try: - return self.func() - except TypeError as e: - pass - - -def AopModel(before=None, after=None, - before_args=None, before_kwargs=None, - after_args=None, after_kwargs=None): - """ - - AOP切面模式: - 依赖AopModel装饰器,再在方法上加入@AopModel即可切入编程 - - - 优点: - - 当使用@AopModel时,内部函数将会逐级调用回调函数,执行循序是: - - func(*self.args, **self.kwargs) - - func(*self.args) - - func(**self.kwargs) - - func() - 这将意味着,如果你的参数传入错误时,AopModel依旧会遵循原始方法所使用的规则,最令人大跌眼镜的使用方法就是: - - def Before(**kwargs): - print('Before:', kwargs) - # 此处的Before方法未存在args参数,而使用@AopModel时却传入了args - @AopModel(before=Before,before_args=(0,1,2), before_kwargs={'1': '1'}) - def find_title_and_selects(self, **kwargs): - - print('function task', kwargs['uid']) - - _r = self.orm.find().where(index="<<100").end() - - print(_r) - - return _r - - 其中包含参数有: - before:切入时需要执行的函数 - - before_args:切入的参数 - 传入的列表或元组类型数据 - 如果是需要使用当前pojo中的内容时,传参格式为:(pojo.字段名) - 可扩展格式,例如需要传入字典 - - before_kwargs:切入的参数 -- 传入的字典数据 - - after:切出前需要执行的参数 - - after_args:切出的参数 - 传入的列表或元组类型数据 - 如果是需要使用当前pojo中的内容时,传参格式为:('self.字段名') - 可扩展格式,例如需要传入字典:('self.dict.key') - - after_kwargs:切出的参数 -- 传入的字典数据 - - - 执行流程: - - Before->original->After - - Before注意事项: - - 使用该参数时,方法具有返回值概不做处理,需要返回值内容可使用`global`定义一个全局字段用于保存数值 - - 当无法解析或者解析失败时m将使用pass关键字忽略操作 - - After注意事项: - - 使用该参数时,必须搭配至少一个result=None的kwargs存在于方法的形参中, - - 当original方法执行完成将把返回值固定使用result键值对注入到该函数中 - - 当无法解析或者解析失败时m将使用pass关键字忽略操作 - - - - Attributes: - - before:切入时需要执行的函数 - - after:切出前需要执行的参数 - - before_args:切入的参数 - 传入的列表或元组类型数据 - 如果是需要使用当前pojo中的内容时,传参格式为:(pojo.字段名) - 可扩展格式,例如需要传入字典 - - before_kwargs:切入的参数 -- 传入的字典数据 - - after_args:切出的参数 - 传入的列表或元组类型数据 - 如果是需要使用当前pojo中的内容时,传参格式为:('self.字段名') - 可扩展格式,例如需要传入字典:('self.dict.key') - - after_kwargs:切出的参数 -- 传入的字典数据 - - - """ - # 得到对象组 - aop_obj = AopModel_Object(before, after, - before_args, before_kwargs, - after_args, after_kwargs) - - def base_func(func): - aop_obj.set_func(func) - - def _wrapper_(*args, **kwargs): - aop_obj.set_args(*args, **kwargs) - return aop_obj.start() - - return _wrapper_ - - return base_func + return Compulsory.run_function(func=self.func, args=self.args, kwargs=self.kwargs) + # try: + # return self.func(*self.args, **self.kwargs) + # except TypeError as e: + # pass + # + # try: + # return self.func(*self.args) + # except TypeError as e: + # pass + # + # try: + # return self.func(**self.kwargs) + # except TypeError as e: + # pass + # + # try: + # return self.func() + # except TypeError as e: + # pass diff --git a/CACodeFramework/cacode/Factory.py b/CACodeFramework/cacode/Factory.py new file mode 100644 index 0000000..c2abc15 --- /dev/null +++ b/CACodeFramework/cacode/Factory.py @@ -0,0 +1,102 @@ +import copy +import threading +from CACodeFramework.exception import e_fields +from CACodeFramework.opera.CompulsoryRun import Compulsory +from CACodeFramework.util.Log import CACodeLog +import importlib + + +class Factory(object): + + def __init__(self): + if not hasattr(self, 'instances'): + CACodeLog.err(SyntaxError, e_fields.CACode_Factory_Error( + 'Please import the Pojo module first,请先设置导入pojo模块')) + else: + self.instances = self.instances + + self.modules = {} + self.lo = threading.RLock() + + self.__base_init__() + + def __base_init__(self): + for package_name in self.instances: + base_module = str(package_name).split('.') + last_name = base_module[ + (len(base_module) - 1) if + len(base_module) > 0 else + CACodeLog.err(TypeError, + e_fields.CACode_Factory_Error( + '找不到模块,也许是未设置instances') + ) + ] + # 将包导入 + self.modules[last_name] = package_name + + def createInstance(self, name: str, args=None, kwargs=None): + """ + 建造一个对象并将对象实例化 + + 使用方法: + + class MyFactory(Factory): + def __init__(self): + self.instances = [ + 'test.modules.Demo', + 'test.modules.BaseData', + ] + super().__init__() + + + if __name__ == '__main__': + myFactory = MyFactory() + ins = myFactory.createInstance("Demo.DemoTable",kwargs={}) + print(ins) + + + + + :param name:类的名称,从配置的instances开始获得 + :param args:类的名称,从配置的instances开始获得 + :param kwargs:类的名称,从配置的instances开始获得 + """ + module_names = str(name).split('.') + first_module = module_names[0] + del module_names[0] + + assert len(module_names) > 0 + + import_module = importlib.import_module(self.modules[first_module]) + + # import_module = __import__(self.modules[first_module]) + + # all_modules = getattr(import_module, first_module) + result = self.search_target(import_module, module_names) + + end_obj = Compulsory.run_function(func=result, args=args, kwargs=kwargs) + + return end_obj + + def __get__(self, instance, owner): + if not hasattr(self, 'lo'): + with instance.lo.lock(): + lock = instance.__new__() + return instance + else: + self.instances = instance + return self.instances + + def search_target(self, module, target_names): + if len(target_names) == 0: + return module + # 当前的标记位置 + now_target = target_names[0] + del target_names[0] + if hasattr(module, now_target): + next_module = getattr(module, now_target) + return self.search_target(next_module, target_names) + else: + CACodeLog.err(ImportError, + e_fields.CACode_Factory_Error( + f"""The package name does not exist in the search tree: {now_target}, please check whether the package name is filled in correctly""")) diff --git a/CACodeFramework/cacode/serialize.py b/CACodeFramework/cacode/Serialize.py similarity index 55% rename from CACodeFramework/cacode/serialize.py rename to CACodeFramework/cacode/Serialize.py index cc3b132..1215634 100644 --- a/CACodeFramework/cacode/serialize.py +++ b/CACodeFramework/cacode/Serialize.py @@ -4,6 +4,9 @@ from CACodeFramework.util import JsonUtil def list_of_groups(init_list, size): + """ + 将数据集按照一定数量分组并返回新数组 + """ lo_groups = zip(*(iter(init_list),) * size) end_list = [list(i) for i in lo_groups] count = len(init_list) % size @@ -12,8 +15,40 @@ def list_of_groups(init_list, size): class QuerySet(list): + """ + 执行database operation返回的结果集对象 + + 元类: + list + + 附加方法: + first(): + 返回结果集对象的第一个数据 + + last(): + 返回结果集对象的最后一位参数 + + page(size): + 按照每一页有size数量的结果分页 + + to_json(): + 将结果集对象转json字符串 + + + Attr + + """ def __init__(self, instance, base_data: list): + """ + 初始化传入结果集并附加上base_data数据集 + + instance: + 序列化的实例对象 + + base_data: + 初始化数据源 + """ list.__init__([]) self.__instance__ = instance for i in base_data: @@ -37,10 +72,16 @@ class QuerySet(list): """ return list_of_groups(self, size) - def to_json(self): + def to_json(self, bf=False): + """ + 将结果集对象转json处理 + :param bf:是否需要美化sql + """ this_dict = JsonUtil.parse(obj=self, end_load=True) result = [] + # 取得隐藏参数 show_fields = self.__instance__.__fields__ + # 过滤不需要序列化的参数 for i, v in enumerate(this_dict): children = {} for sf in show_fields: @@ -49,7 +90,7 @@ class QuerySet(list): result.append(children) - return JsonUtil.parse(obj=result) + return JsonUtil.parse(obj=result, bf=bf) - def __str__(self): - return JsonUtil.parse(self) + def objects(self): + pass diff --git a/CACodeFramework/exception/e_fields.py b/CACodeFramework/exception/e_fields.py index 6600835..4469127 100644 --- a/CACodeFramework/exception/e_fields.py +++ b/CACodeFramework/exception/e_fields.py @@ -8,5 +8,12 @@ DB_TASK = 'DATABASE OPERATION' PARSE_ERROR = 'CACode-Parse' +# INSTANCES_ERROR = 'CACode-Factory' + + def CACode_SQLERROR(msg): return '%s:%s' % ('CACode-Sql', msg) + + +def CACode_Factory_Error(msg): + return 'CACode-Factory:{}'.format(msg) diff --git a/CACodeFramework/opera/CompulsoryRun.py b/CACodeFramework/opera/CompulsoryRun.py new file mode 100644 index 0000000..1f84247 --- /dev/null +++ b/CACodeFramework/opera/CompulsoryRun.py @@ -0,0 +1,25 @@ +class Compulsory(object): + @staticmethod + def run_function(func, args, kwargs): + """ + 强制执行 + """ + try: + return func(*args, **kwargs) + except TypeError as e: + pass + + try: + return func(*args) + except TypeError as e: + pass + + try: + return func(**kwargs) + except TypeError as e: + pass + + try: + return func() + except TypeError as e: + pass diff --git a/CACodeFramework/opera/obj_dict.py b/CACodeFramework/opera/obj_dict.py deleted file mode 100644 index 78b876d..0000000 --- a/CACodeFramework/opera/obj_dict.py +++ /dev/null @@ -1,84 +0,0 @@ -from CACodeFramework.pojoManager import Manage -from CACodeFramework.util.ParseUtil import ParseUtil - - -class parses(object): - def __init__(self, *args, **kwargs): - self.args = args - self.kwargs = kwargs - - def last_id(self, **kwargs): - """作者:CACode 最后编辑于2021/4/12 - - 遵循规则: - - 内部>配置文件 - - 是否包含返回最后一行ID的配置 - - 只存在于更新操做的方法内,如: - - insert, - - update, - - delete - - Attributes: - - conf_obj:配置类 - """ - conf_obj = kwargs['config_obj'] - if 'last_id' not in kwargs.keys(): - c_dict = conf_obj.get_dict() - if 'last_id' in c_dict.keys(): - kwargs['last_id'] = c_dict['last_id'] - else: - kwargs['last_id'] = False - return kwargs - - def print_sql(self, **kwargs): - """ - 遵循规则: - 内部>配置文件 - - 是否包含打印sql的配置 - - 存在于所有数据库操做 - - Attributes: - conf_obj:配置类 - """ - conf_obj = kwargs['config_obj'] - if 'print_sql' not in kwargs.keys(): - c_dict = conf_obj.get_dict() - if 'print_sql' in c_dict.keys(): - kwargs['print_sql'] = c_dict['print_sql'] - else: - kwargs['print_sql'] = False - return kwargs - - def parse_insert(self, pojo, __table_name__): - """ - 解析插入语句 - - INSERT INTO `__table_name__`(`title`,'selects') VALUE ('','') - - :param pojo:POJO对象 - :param __table_name__:表名 - :return: - """ - _dict = pojo.fields - # 得到所有的键 - keys = pojo.fields - # 在得到值之后解析是否为空并删除为空的值和对应的字段 - cp_value = [] - # 复制新的一张字段信息 - keys_copy = [] - - values = [getattr(pojo, v) for v in keys] - for i, j in enumerate(values): - if j is not None and not Manage.Pojo.is_default(j): - keys_copy.append(keys[i]) - cp_value.append(j) - return ParseUtil().parse_insert(keys_copy, cp_value, __table_name__) diff --git a/CACodeFramework/opera/op_db.py b/CACodeFramework/opera/op_db.py index 235346d..bf7747b 100644 --- a/CACodeFramework/opera/op_db.py +++ b/CACodeFramework/opera/op_db.py @@ -1,9 +1,8 @@ import threading -from CACodeFramework.cacode.serialize import QuerySet +from CACodeFramework.cacode.Serialize import QuerySet from CACodeFramework.util.Log import CACodeLog -from CACodeFramework.opera.obj_dict import parses from CACodeFramework.field.sql_fields import * from CACodeFramework.util.ParseUtil import ParseUtil @@ -16,7 +15,6 @@ class DbOperation(object): def __init__(self, *args, **kwargs): self.args = args self.kwargs = kwargs - self.parse_util = parses() self.result = None def start(self, *args, **kwargs): @@ -70,12 +68,8 @@ class DbOperation(object): 任务方法 """ # kwargs['conf_obj'] = config_obj - kwargs = self.parse_util.print_sql(**kwargs) + kwargs = ParseUtil.print_sql(**kwargs) self.result = self.__find_sql__(**kwargs) - # _pojo_list = [] - # for item in _r: - # pojo = self.parse_util.parse_obj(item, participants=kwargs['participants']) - # _pojo_list.append(pojo) return self.result def __find_sql__(self, **kwargs): @@ -83,7 +77,7 @@ class DbOperation(object): 任务方法 """ - kwargs = self.parse_util.print_sql(**kwargs) + kwargs = ParseUtil.print_sql(**kwargs) _rs = kwargs['db_util'].select(**kwargs) self.result = [] @@ -98,14 +92,14 @@ class DbOperation(object): 任务方法 """ - kwargs = self.parse_util.print_sql(**kwargs) + kwargs = ParseUtil.print_sql(**kwargs) - kwargs = self.parse_util.last_id(**kwargs) + kwargs = ParseUtil.last_id(**kwargs) if 'pojo' not in kwargs.keys(): raise SyntaxError('the key of `pojo` cannot be found in the parameters') - filed_list = self.parse_util.parse_insert(kwargs['pojo'], __table_name__=kwargs['__table_name__']) + filed_list = ParseUtil.parse_insert_pojo(kwargs['pojo'], __table_name__=kwargs['__table_name__']) kwargs.update(filed_list) diff --git a/CACodeFramework/pojoManager/Manage.py b/CACodeFramework/pojoManager/Manage.py index 6e1d2e9..555fc36 100644 --- a/CACodeFramework/pojoManager/Manage.py +++ b/CACodeFramework/pojoManager/Manage.py @@ -10,10 +10,10 @@ class Pojo(CACodeRepository.Repository): 初始化ORM框架 """ - if '__table_name__' not in self.__dict__: + if not hasattr(self, '__table_name__'): self.__table_name__ = self.__class__.__name__ - if '__table_msg__' not in self.__dict__: + if not hasattr(self, '__table_msg__'): self.__table_msg__ = 'The current object has no description' self.__table_name__ = self.__table_name__ @@ -21,7 +21,8 @@ class Pojo(CACodeRepository.Repository): self.init_fields() for key, value in kwargs.items(): self.__setattr__(key, value) - super(Pojo, self).__init__(config_obj=config_obj, + # 在这里将config_obj实例化 + super(Pojo, self).__init__(config_obj=config_obj(), participants=self, log_conf=log_conf, close_log=close_log) @@ -61,18 +62,6 @@ class Pojo(CACodeRepository.Repository): """ return JsonUtil.load(JsonUtil.parse(self)) - @staticmethod - def is_default(val): - """ - 是否等于默认值 - """ - try: - t_v = val.__class__.__bases__ - t_bf = tag.baseTag - return t_v[len(t_v) - 1] == t_bf - except SyntaxError: - return False - @property def orm(self): """ @@ -81,6 +70,9 @@ class Pojo(CACodeRepository.Repository): return CACodePureORM(self) def format(self, key, name): + """ + 为指定字段的值设置别名 + """ if 'ig' in self.__fields__.keys(): self.__fields__['ig'].append({ key: name diff --git a/CACodeFramework/util/ParseUtil.py b/CACodeFramework/util/ParseUtil.py index f82061d..a2a29e2 100644 --- a/CACodeFramework/util/ParseUtil.py +++ b/CACodeFramework/util/ParseUtil.py @@ -1,9 +1,6 @@ import copy -from CACodeFramework.field.sql_fields import * - - -# from CACodeFramework.pojoManager.Manage import Pojo +from CACodeFramework.pojoManager import tag def parse_main(*args, to_str=False, is_field=False): @@ -78,7 +75,7 @@ class ParseUtil(object): values = parse_main(*self.args, to_str=self.to_str) return values - def parse_insert(self, keys, values, __table_name__): + def parse_insert(self, keys, values, __table_name__, insert_str, values_str): """ 解析成insert语句 """ @@ -110,6 +107,35 @@ class ParseUtil(object): kes['params'] = args return kes + @staticmethod + def parse_insert_pojo(pojo, __table_name__, insert_str, values_str): + """ + 解析插入语句 + + INSERT INTO `__table_name__`(`title`,'selects') VALUE ('','') + + :param pojo:POJO对象 + :param __table_name__:表名 + :param insert_str:insert的sql方言 + :param values_str:values的sql方言 + :return: + """ + _dict = pojo.fields + # 得到所有的键 + keys = pojo.fields + # 在得到值之后解析是否为空并删除为空的值和对应的字段 + cp_value = [] + # 复制新的一张字段信息 + keys_copy = [] + + values = [getattr(pojo, v) for v in keys] + for i, j in enumerate(values): + if j is not None and not ParseUtil.is_default(j): + keys_copy.append(keys[i]) + cp_value.append(j) + return ParseUtil().parse_insert(keys_copy, cp_value, __table_name__, insert_str=insert_str, + values_str=values_str) + @staticmethod def parse_obj(data: dict, instance: object) -> object: """ @@ -125,3 +151,113 @@ class ParseUtil(object): for key, value in data.items(): setattr(part_obj, key, value) return part_obj + + @staticmethod + def last_id(**kwargs): + """作者:CACode 最后编辑于2021/4/12 + + 遵循规则: + + 内部>配置文件 + + 是否包含返回最后一行ID的配置 + + 只存在于更新操做的方法内,如: + + insert, + + update, + + delete + + Attributes: + + conf_obj:配置类 + """ + conf_obj = kwargs['config_obj'] + if 'last_id' not in kwargs.keys(): + c_dict = conf_obj.get_dict() + if 'last_id' in c_dict.keys(): + kwargs['last_id'] = c_dict['last_id'] + else: + kwargs['last_id'] = False + return kwargs + + @staticmethod + def print_sql(**kwargs): + """ + 遵循规则: + 内部>配置文件 + + 是否包含打印sql的配置 + + 存在于所有数据库操做 + + Attributes: + conf_obj:配置类 + """ + conf_obj = kwargs['config_obj'] + if 'print_sql' not in kwargs.keys(): + c_dict = conf_obj.get_dict() + if 'print_sql' in c_dict.keys(): + kwargs['print_sql'] = c_dict['print_sql'] + else: + kwargs['print_sql'] = False + return kwargs + + @staticmethod + def case_name(text, rep_text='_', lower=True, upper=False): + """ + 将驼峰文本改为使用指定符号分割的字符串表达形式并全部小写 + :param text:需要替换的文本 + :param rep_text:在大写文本后面追加的字符串 + :param lower:是否需要全部小写 + :param upper:是否需要全部大写 + """ + lst = [] + for index, char in enumerate(text): + if char.isupper() and index != 0: + lst.append(rep_text) + lst.append(char) + + if lower: + return "".join(lst).lower() + elif upper: + return "".join(lst).upper() + else: + return "".join(lst) + + @staticmethod + def is_default(__val): + """ + 是否等于默认值 + """ + try: + t_v = __val.__class__.__bases__ + t_bf = tag.baseTag + return t_v[len(t_v) - 1] == t_bf + except SyntaxError: + return False + + @staticmethod + def set_field(obj, key, value): + """ + 当对象没有这个字段时,为对象设置一个字段 + + 为了方便提高拓展性可解耦,框架内部务必使用此 + + 方法或者set_field_compulsory()为操作管理类提供对象 + + """ + if not hasattr(obj, key): + setattr(obj, key, value) + + @staticmethod + def set_field_compulsory(obj, key, value): + """ + 强制为一个对象设置一个字段并赋值 + + 此方法使用会覆盖原有的字段内容,强制使用覆盖字段时请先结合已有字段值判断是否真正需要覆盖操作 + + """ + setattr(obj, key, value) diff --git a/test/modules/BaseData.py b/test/modules/BaseData.py new file mode 100644 index 0000000..8f1e339 --- /dev/null +++ b/test/modules/BaseData.py @@ -0,0 +1,8 @@ +from CACodeFramework.pojoManager import Manage +from CACodeFramework.pojoManager.Manage import Pojo + + +class BaseData(Pojo): + def __init__(self): + self.id = Manage.tag.intField() + super(BaseData, self).__init__() diff --git a/test/modules/DatabaseConf.py b/test/modules/DatabaseConf.py new file mode 100644 index 0000000..27dbd03 --- /dev/null +++ b/test/modules/DatabaseConf.py @@ -0,0 +1,15 @@ +from CACodeFramework.util import Config + + +class ConF(Config.config): + def __init__(self, + host='localhost', + port=3306, + database='demo', + user='root', + password='123456', + charset='utf8'): + self.set_field('print_sql', True) + self.set_field('last_id', True) + + super(ConF, self).__init__(host, port, database, user, password, charset) diff --git a/test/modules/Demo.py b/test/modules/Demo.py new file mode 100644 index 0000000..7a322af --- /dev/null +++ b/test/modules/Demo.py @@ -0,0 +1,41 @@ +from CACodeFramework.anno.annos import Select, Table, AopModel +from CACodeFramework.pojoManager import Manage +from test.modules.DatabaseConf import ConF + + +def Before(**kwargs): + print('Before:', kwargs) + + +def After(*args, **kwargs): + print('After', args) + print('Result:', kwargs) + + +@Table(name='demo_table', msg='测试类') +class DemoTable(Manage.Pojo): + + def __init__(self, **kwargs): + self.t_id = Manage.tag.intField(primary_key=True) + self.t_name = Manage.tag.varcharField(length=255) + self.t_pwd = Manage.tag.varcharField(length=255) + self.t_msg = Manage.tag.varcharField(length=255) + self.create_time = Manage.tag.datetimeField(auto_time=True) + self.update_time = Manage.tag.datetimeField(update_auto_time=True) + + super(DemoTable, self).__init__(config_obj=ConF, **kwargs) + + @AopModel(before=Before, before_kwargs={'1': '1'}, after=After) + def find_title_and_selects(self, **kwargs): + print('function task', kwargs['uid']) + _r = self.orm.find().end() + print(_r) + return _r + + @Select(sql="SELECT * FROM demo_table WHERE t_id<=%s AND t_msg like %s", + params=['10', '%${t_msg}%${t_id}%']) + class FindWheresTIdAndTMsg: + def __init__(self, t_id, t_msg): + self.t_id = t_id + self.t_msg = t_msg + self.meta = DemoTable diff --git a/test/modules/__init__.py b/test/modules/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/test/test.py b/test/test.py deleted file mode 100644 index 562431e..0000000 --- a/test/test.py +++ /dev/null @@ -1,113 +0,0 @@ -import threading -import uuid - -from CACodeFramework.anno.annos import Table, Select -from CACodeFramework.anno.aop import AopModel -from CACodeFramework.pojoManager import Manage - -from CACodeFramework.util import Config, JsonUtil - - -class ConF(Config.config): - def __init__(self, - host='localhost', - port=3306, - database='demo', - user='root', - password='123456', - charset='utf8'): - self.set_field('print_sql', True) - self.set_field('last_id', True) - - super(ConF, self).__init__(host, port, database, user, password, charset) - - -def Before(**kwargs): - print('Before:', kwargs) - - -def After(*args, **kwargs): - print('After', args) - print('Result:', kwargs) - - -# @Table(name="demo_table", msg="demo message") -class demo_table(Manage.Pojo): - def __init__(self, **kwargs): - self.t_id = Manage.tag.intField(primary_key=True) - self.t_name = Manage.tag.varcharField(length=255) - self.t_pwd = Manage.tag.varcharField(length=255) - self.t_msg = Manage.tag.varcharField(length=255) - self.create_time = Manage.tag.datetimeField(auto_time=True) - self.update_time = Manage.tag.datetimeField(update_auto_time=True) - - super(demo_table, self).__init__(config_obj=ConF(), **kwargs) - - @AopModel(before=Before, before_kwargs={'1': '1'}, after=After) - def find_title_and_selects(self, **kwargs): - print('function task', kwargs['uid']) - _r = self.orm.find().end() - print(_r) - return _r - - @Select(sql="SELECT COUNT(*) FROM demo_table WHERE t_id<=%s AND t_msg like %s", params=[10, '${t_msg}']) - class find_all_where_tid_and_t_msg: - def __init__(self, t_id, t_msg): - self.t_id = t_id - self.t_msg = t_msg - self.meta = demo_table - - -def setData(): - end = demo_table().orm.find().order_by('t_id').desc().limit(1).first().end() - for i in range(end.t_id, 100000 * end.t_id): - demo_table(t_name='{}{}'.format('测试name', i), t_pwd='{}{}'.format('测试pwd', i), - t_msg='{}{}'.format('测试msg', i)).save() - # a.append(h) - # _result = testClass.insert_one(pojo=h) - # _r = demo_table().orm.insert(h).end() - # h.insert_many(pojo_list=a) - # _result = testClass.insert_many(pojo_list=pojos) - # print('受影响行数:{}\t,\t已插入:{}'.format(_result, i)) - - -data_count = 0 - - -def th(): - def A(): - for i in range(100): - demo_table(t_name='test_name', t_pwd='123', t_msg='123').save() - - a = threading.Thread(target=A) - return a - - -if __name__ == '__main__': - # setData() - # c = demo_table().orm.find('count(*)', asses=['c'], h_func=True).end()[0] - # print('count:', c.c) - # t1 = time.time() - # t = th() - # for i in t: - # i.start() - # i.join() - # t2 = time.time() - # print('time:', t2 - t1) - # print('data count:', data_count) - # print('average:', data_count / (t2 - t1)) - d = demo_table() - print(d.find_all().to_json()) - # result = d.find_all_where_tid_and_t_msg(t_id=10, t_msg='%测试msg%').to_json() - # print(result) - # u = uuid.uuid1() - # result = d.find_title_and_selects(uid=u) - # print(JsonUtil.parse(result, True)) - # a = d.find_all_where_tid(1).run() - # print(a) - # re = d.orm.find('t_id', 't_name', 't_pwd').where(t_id="<<10").first().end() - # print(re.to_json(True)) - # d.before_find_title_and_selects(*d.before_args_find_title_and_selects, - # **d.before_kwargs_find_title_and_selects) - # _r = d.orm.update().set(success='true').where(index=17034).end() - # print(_r) diff --git a/test/testFunc.py b/test/testFunc.py new file mode 100644 index 0000000..01b49c6 --- /dev/null +++ b/test/testFunc.py @@ -0,0 +1,17 @@ +from CACodeFramework.cacode.Factory import Factory + + +class MyFactory(Factory): + def __init__(self): + self.instances = [ + 'test.modules.Demo', + 'test.modules.BaseData', + ] + super().__init__() + + +if __name__ == '__main__': + myFactory = MyFactory() + + ins = myFactory.createInstance("Demo.DemoTable") + print(ins.FindWheresTIdAndTMsg(t_id=10, t_msg='测试')) -- Gitee From 388806d990e66039e6a57a1f84c46d563fa1590f Mon Sep 17 00:00:00 2001 From: CACode Date: Tue, 27 Apr 2021 00:54:29 +0800 Subject: [PATCH 17/21] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=B7=A5=E5=8E=82?= =?UTF-8?q?=E4=B8=BA=E5=8D=95=E4=BE=8B=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CACodeFramework/anno/annos.py | 20 +++++------ CACodeFramework/cache/__init__.py | 5 +++ CACodeFramework/cacode/Factory.py | 54 ++++++++++++++--------------- CACodeFramework/cacode/Modes.py | 26 ++++++++++++++ CACodeFramework/cacode/Serialize.py | 4 +-- test/modules/Demo.py | 9 +++-- test/testFunc.py | 22 ++++++------ 7 files changed, 88 insertions(+), 52 deletions(-) create mode 100644 CACodeFramework/cacode/Modes.py diff --git a/CACodeFramework/anno/annos.py b/CACodeFramework/anno/annos.py index 7932fc8..7c37061 100644 --- a/CACodeFramework/anno/annos.py +++ b/CACodeFramework/anno/annos.py @@ -29,20 +29,20 @@ def parse_kwargs(params, kwargs): """ new_args = [] for i in params: - context = re.findall(r'{(.*?)}', str(i)) + sub = re.sub(r'\${(.*?)}', '{}', str(i)) + context = re.findall(r'\${(.*?)}', str(i)) if context: + mk = [] for con in context: - new_args.append(kwargs[con]) + mk.append(kwargs[con]) + new_args.append(sub.format(*mk)) + else: new_args.append(i) return new_args -def first_func(): - return inspect.stack() - - def Select(sql, params=None): """ 快捷的查询装饰器 @@ -62,10 +62,10 @@ def Select(sql, params=None): def base_func(cls): def _wrapper_(*args, **kwargs): - l = list(args) - del l[0] - cls_obj = cls(*l, **kwargs) - obj = cls_obj.meta() + lines = list(args) + obj = lines[0] + del lines[0] + # cls_obj = cls(*lines, **kwargs) new_args = parse_kwargs(params, kwargs) diff --git a/CACodeFramework/cache/__init__.py b/CACodeFramework/cache/__init__.py index e69de29..d415e1d 100644 --- a/CACodeFramework/cache/__init__.py +++ b/CACodeFramework/cache/__init__.py @@ -0,0 +1,5 @@ +# -*- utf-8 -*- +# @Time: 2021/4/21 0:41 +# @Author: CACode +# @File: __init__.py +# @Software: PyCharm diff --git a/CACodeFramework/cacode/Factory.py b/CACodeFramework/cacode/Factory.py index c2abc15..ccfd208 100644 --- a/CACodeFramework/cacode/Factory.py +++ b/CACodeFramework/cacode/Factory.py @@ -1,5 +1,6 @@ -import copy import threading + +from CACodeFramework.cacode import Modes from CACodeFramework.exception import e_fields from CACodeFramework.opera.CompulsoryRun import Compulsory from CACodeFramework.util.Log import CACodeLog @@ -7,34 +8,41 @@ import importlib class Factory(object): + _instance_lock = threading.Lock() - def __init__(self): - if not hasattr(self, 'instances'): + def __init__(self, modules): + try: + self.modules = modules + except AttributeError: CACodeLog.err(SyntaxError, e_fields.CACode_Factory_Error( - 'Please import the Pojo module first,请先设置导入pojo模块')) - else: - self.instances = self.instances - - self.modules = {} - self.lo = threading.RLock() + 'Please import the Pojo module first,请先设置导入modules模块')) + self.module_names = {} self.__base_init__() def __base_init__(self): - for package_name in self.instances: + for package_name in self.modules: base_module = str(package_name).split('.') last_name = base_module[ (len(base_module) - 1) if len(base_module) > 0 else CACodeLog.err(TypeError, e_fields.CACode_Factory_Error( - '找不到模块,也许是未设置instances') + """The module cannot be found, perhaps the `instances` are not set,找不到模块,也许是未设置`instances`""") ) ] # 将包导入 - self.modules[last_name] = package_name + self.module_names[last_name] = package_name - def createInstance(self, name: str, args=None, kwargs=None): + @staticmethod + def initializationFactory(cls): + with cls._instance_lock: + if not hasattr(cls, "__instance__"): + cls.__instance__ = Factory(cls.modules) + return cls.__instance__ + + @classmethod + def createInstance(cls, name: str, args=None, kwargs=None): """ 建造一个对象并将对象实例化 @@ -61,32 +69,24 @@ class Factory(object): :param args:类的名称,从配置的instances开始获得 :param kwargs:类的名称,从配置的instances开始获得 """ + + # 使用单例模式初始化仓库 + this = Modes.Singleton.create(cls) + module_names = str(name).split('.') first_module = module_names[0] del module_names[0] assert len(module_names) > 0 - import_module = importlib.import_module(self.modules[first_module]) - - # import_module = __import__(self.modules[first_module]) + import_module = importlib.import_module(this.module_names[first_module]) - # all_modules = getattr(import_module, first_module) - result = self.search_target(import_module, module_names) + result = this.search_target(import_module, module_names) end_obj = Compulsory.run_function(func=result, args=args, kwargs=kwargs) return end_obj - def __get__(self, instance, owner): - if not hasattr(self, 'lo'): - with instance.lo.lock(): - lock = instance.__new__() - return instance - else: - self.instances = instance - return self.instances - def search_target(self, module, target_names): if len(target_names) == 0: return module diff --git a/CACodeFramework/cacode/Modes.py b/CACodeFramework/cacode/Modes.py new file mode 100644 index 0000000..571c486 --- /dev/null +++ b/CACodeFramework/cacode/Modes.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- # +# ------------------------------------------------------------------ +# File Name: Modes +# Author: CACode +# Version: 1.2 +# Created: 2021/4/27 +# Description: Main Function: 所有用到的设计模式 +# 此文件内保存可外置的设计模式,用于让那些脑瘫知道我写的框架用了什么设计模式而不是 +# 一遍一遍问我这框架都用了什么设计模式、体现在哪里,我叼你妈 +# Class List: Singleton -- 单例模式 +# History: +#