From d329857a914952917b42b599c0f92df5281d5743 Mon Sep 17 00:00:00 2001 From: alex Date: Sat, 2 Dec 2023 22:11:07 +0100 Subject: [PATCH] create, read, update and delete methods works --- .gitignore | 1 + exceldb.py | 77 ++++++++++++++++++++++++++++++--------------- main.py | 14 +++++++-- model.py | 19 +++++++++-- models.py | 11 ++++--- testdata/data.xlsx | Bin 5455 -> 6252 bytes 6 files changed, 86 insertions(+), 36 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..62c8935 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea/ \ No newline at end of file diff --git a/exceldb.py b/exceldb.py index 504953c..cd58464 100644 --- a/exceldb.py +++ b/exceldb.py @@ -4,51 +4,76 @@ from openpyxl import Workbook, load_workbook class ExcelDB: - def __init__(self, path, password=None, offset_row=0, offset_column=0): + def __init__(self, path, password=None): self._path = path self._pass = password - self._offset_row = offset_row - self._offset_column = offset_column def init(self): pass - def save(self, model): - wb = load_workbook(self._path) - ws = wb[model.Meta.table] - ws["A1"] = model.username + def create(self, model): + wb, ws = self.get_worksheet(model) + if model.row is None: + next_row = len(tuple(ws.rows)) + 1 + else: + next_row = model.row + for e in self._get_params(model): + c = ws.cell(next_row, type(model).__dict__.get(e).column+model.offset_cols) + c.value = model.__dict__.get(e) + model.row = next_row wb.save(self._path) - def create(self, model): - wb = load_workbook(self._path) - ws = wb[model.Meta.table] - next_row = len(tuple(ws.rows)) + 1 - next_column = 1 + self._offset_column + def _get_element(self, search_for, elements): + for e in elements: + if e.value == search_for: + return e + return None + + def _get_params(self, model): + params = list() for e in model.__dict__: - if e in ['__module__', 'Meta', '__doc__']: + if e in ['offset_rows', 'offset_cols', '_row', '_init', 'Meta', ] or e.startswith('__'): continue - c = ws.cell(next_row, next_column) - c.value = model.__dict__.get(e) - next_column = next_column + 1 - wb.save(self._path) + else: + params.append(e) + return params def read(self, model): + wb, ws = self.get_worksheet(model) + entries = list() + model_params = self._get_params(model) + for row in ws.rows: + if row[0].row <= (model.offset_rows + 1): + continue + params = dict() + for p in model_params: + params[p] = row[model.__dict__.get(p).column-1].value + entries.append(model(**params)) + return entries + + def update(self, model): + self.create(model) + + def delete(self, model): + wb, ws = self.get_worksheet(model) + ws.delete_rows(model.row) + wb.save(self._path) + + def get_worksheet(self, model): wb = load_workbook(self._path) ws = wb[model.Meta.table] + return wb, ws - - def create_tables(self, tables): + def create_tables(self, models): wb = Workbook() wb.remove_sheet(wb.active) - for t in tables: - wb.create_sheet(t.Meta.table) - ws = wb[t.Meta.table] + for model in models: + wb.create_sheet(model.Meta.table) + ws = wb[model.Meta.table] i = 1 - for e in t.__dict__: - if e in ['__init__', '__module__', 'Meta', '__doc__']: - continue + for e in self._get_params(model): c = ws.cell(1, i) - c.value = t.__dict__.get(e).caption + c.value = model.__dict__.get(e).caption i = i + 1 wb.save(self._path) diff --git a/main.py b/main.py index 7b1ccd7..767eeb8 100644 --- a/main.py +++ b/main.py @@ -6,5 +6,15 @@ edb = ExcelDB("./testdata/data.xlsx") # edb.create_tables([TestModel, Test1Model]) TestModel.Meta.database = edb -test1 = TestModel(username='Cool Hacker', datum='2023-11-12') -test1.create() +# test1 = TestModel(username='Cool Hacker', datum='2023-11-12', test="Alex") +# test1.create() +#test1.delete() +# test1.username = "Very cool Hacker" + + +Test1Model.Meta.database = edb +Test1Model(username="Natusik", nickname='Barabusik', creater='Alex').create() + +for t1 in edb.read(Test1Model): + print(t1.username, t1.creater) + diff --git a/model.py b/model.py index da45346..c4cd6c2 100644 --- a/model.py +++ b/model.py @@ -13,6 +13,16 @@ class BaseModel: self._init(type(self), **params) _column = None + offset_rows = 0 + offset_cols = 0 + + @property + def row(self): + return self._row + + @row.setter + def row(self, idx): + self._row = idx @classmethod def get_column(cls): @@ -26,12 +36,15 @@ class BaseModel: def get_by_id(cls, id): return "GET " + str(id) - def save(self): - self.Meta.database.save(self) - def create(self): self.Meta.database.create(self) + def update(self): + self.Meta.database.update(self) + + def delete(self): + self.Meta.database.delete(self) + class Meta: database = None diff --git a/models.py b/models.py index 7a31c23..36585ce 100644 --- a/models.py +++ b/models.py @@ -16,11 +16,12 @@ class TestModel(BaseModel): class Test1Model(BaseModel): - username = Field('NoName', 1) - nickname = Field("anoter name", 2) - datum = Field('datum', 3) - creater = Field('creater', 4) - test = Field('test', 5) + offset_rows = 9 + username = Field('NoName', 5) + nickname = Field("anoter name", 6) + datum = Field('datum', 7) + creater = Field('creater', 8) + test = Field('test', 9) class Meta: table = 'NoNames' diff --git a/testdata/data.xlsx b/testdata/data.xlsx index 8eed7dd6bb9cc19c32ff20169b8bda80bff4f756..43135389e4d70ff4f62b21f8b797c3971e425bbc 100644 GIT binary patch delta 4933 zcmZ9Q2RK{b|HosGSXE+ETdf$aQd^~{t!C|AF`~3ai%S$ON;Ot(wW~F%M$ss0)ZQa0 zshXws-hcY{{e4HCJUP$v&gZ_*>wL~R_n!Od75ptmp{GeeNCyIeNI^U$aTFy0PYKe* z=el_1>6tc<2LfF>YaI~wdR_=mZ>T-O%Td(N-R(tOr%tmN4GhTZP*~@t3z>aPU`Iqt zo1pYt_zC9TSL*TbTp;!`=3|2CL;v|n8OfX}L9tox`r8~=oCsXR$9j14o8Dq(Ss7I{ zmcMii#Xl9AYgH5Sj(ZS=1Pracz|ZUgqJ$la924&oj@a@UljIspN(8id;NK6+A^?l> zt1=^X#wq&q0Tw=I9jb3#Md;O3bh?)#H&VeW1D8MRI&F}sqs&`ltOa{Ht|o3pw{xql z-z<*9>6Bgx+CiAOi)TFC?~mYMAJt9BO0K$|eLde*h0*c@?=h>H0>d$X);7kit5P*` zyj#B6*ZC{A(%ME9sUjcKs%mHdr?jD2-4^ISvxYR;#c%wbNB{!S(4v;`m;qBwZ;Tkt zi4Z%EWnbgU|5rGX>=cnXpl68%noO==)8_&Kc_TN=b z9=a`^ZHk=d>J%!kGNvpye!%r5S_M(})f4Z*iJsd?AY0z&=f27s+M;k})qTs{S2kSn z9!Co!)<3nou2yG=r(cc+7}S+k>AiB(6w9NlCrW6NOb5bX3Sx^FDw;7b2&$}yHNe+=SA$ld<{v+eRD%iL+4j| zK+a66UPk1rxpms7@NA{jMMEYzsTQ-(9L@zBY{+}$HRbNydcml=nwgn0X?cryy>80(#Pf=x1RO-t-n5M!Wb?-` zX{si_V&u{09|?Tsb7zlXmX0Y#Eg(Y5?m@}g%`##yY`&ls#jo&m1DDdg!sLSk^|A-ah(NO1k!n6EgTqu)g z%Gd13?)}2$)90L7O1|!CU^18)^anW;vG%P^gOeUdpQNcsz|E;=B`ingS+X&cN4SIh z6}O>JT5bV-(9se3q3J`CTkE=vclH$HD_8GZ_r4#P<^SAHs3t0L3pXS3s7zyt=0Ki- z%$`b@s&|UoZ?`Au%{=SQ7qH@*!Mn1qcL&s6?P+T9*P1DK_&?)5y0CK;Z8Us>GW&1E z&ORt4;ppUEWWT2DaJ16*eEe7q_UUo3eE?X|C8Ka?=!q)1&o;@wH!fEFM`|z;2$Ud> z5+>yUQY{e}b-M7=$d*8RxfAt!mvRF>F5an2E&SD1*+^hoEWT*62l=XBvRasEXvoCwu?vx0!9N!NG>fMWz_;(Fl8g>I94-ad5mOI~R2W7B0b#$Go!#{rLvO!61Q2dBLH=gg0DC#tJ(zN=k1is)_8-ZuKwfk3t%N`{T4 z=KcZ!*NKODF8IYaMk`Vmn%jg~MkqAVNe6w}>?EbFL%K`#8|EQ;JDP<$BH zvbV%ZIs3*w+RM6YszPDn{ftW9mc)v85|m+t6(5UxIcqnexKO${n%M2BmcBi&35Zu8 zjksWEDy^ROL~YGCZ9o4sn_MrhgAE26SES#yPoRScYUYD0Ppc2WpF;v>XbNO^aogDq z^wYZC0`J zj-ff+asP9=uY;Fjj~4c|N^aqq){ywruHMSZ&*+`(prs#G(-$zh!)pr0m|{(}2J&lR zHj}10V#EXt`cqtD4}|#{L*t?fy)GroBwmhg?1LHBl4`MalC|3W=6Y*MI2SWZXfNh> zi5`lN0@}Qg;*6i4y=4d)x0h*Tq{w`;c2z7un7@7$)LbACKu*DNe%;>C%mnL!4^@C7 ziIlGXCf%6ax$)dpcm{szxx<(otoyFb<~c)ZL7_jn8~gcHn{?N8L%Ppx-7?5}z3~@f+K0+QF?T{-^(uk>UrOb2E3fw(PamytU55FXXZM zW*rhD^Ihbkb>sVwOl|j+}*Uh=r5|s|BUYsFYi!2;W--aNpQDjp+DJ} z9Plsw44D>gh5v_QtF!J~weP~H?~h&If5>J2WY?j1|3B#ZrzuIn7ZfVpnqMv`vgdd& zD3S~|4bCY7o={0a^XBsYBcCM$&@A%5dO?>rR8RLOaSMGN4saqibG&)uFLVD>Z8iMI?m*)c)MpTRyip&d?7SVwV~4|{{FW5*dq ztIlhu9m`c)LPDR{lhUj$4(c3ZFaK&IaK_kj0gh>s+iPVwBWzFz5M+OFbz=~Za%UC$ zWz67)=&E*!^ZW9ixx7>&z-W~^;AKQ>*H?gLa%1+1~4f&X!j^QZWS7Qfv+A<;U1W!+ET_QQ^2G{^Ay|Dnl z^$I0(*LT*&@s{SZ(AqWVNJF&Aw6)qJTwF7K+f0eX_5@OPK<~IGb}AAC+Uv5>~l@kV-XEEE0q>EHJ6tUKN#lQ zslPGfHD<91BQfIo^{6f<*UqAKuza+;`{6q{oki1kRV~+Y^B;f?=z;Ha`-o9X*9!Sl zjLy%kEWepzS{7JQ6*Xm0d9eiVI}`rFawj2E(8)+l_3i8Y`;m5LHz1lZx>oaSae-dX z3VzV5cP2zr2=lKy9xRKp`LQ52BAQ2tSNn?%hPj-Pg#)5-p9CH6yq}n|oZ9=wOgOV3 z%_J}7NvR^eDE$&(!M2}F)KNBh8BQIhp1v-<=9nxF9=#*CiQlOaz^+ClY$md%?~bsw zey?0`V=GN2;oIqLZ0pGzZw0LgZr`+!7A8bw>L|pha-QeYPcPcce$?l^0&wZnM&oxe zhrx1vYf;|KNg;>5#ijEA-F?L z_^nDy1KKVI_nNOH%T7fv?qEbLN>bd*CF=JyqIcYL>*&{_Ueohy;%Rz~FQ@54Q}ds* z;3e!3@ZMFYT(M>oVsuuT*PK=O`PuWkP-RT~)RnkTfI45fF)`&dqgslK82E%d2sCaZ zzL$QvOAN}<=IU9{=E<;F}^O>U2 z@h#rp%EvvzY!&vU@$KU|E0E?QV^rjK5(oT@;v;JM(^^Zw@e6VD*?cA`&9>Ei5sLVO zfSxAg?-w?tNyY8Nedn{S!3#z;fFVFk>e-f{|4K5XabLeMID!lIcF0(0Sz&9K5M{a% z#$0jdV0+sJ8Ztp)bU1?KiVX~y>+);m@<)^+iSs^)8-e+^?9c z5g#$?@QI-`bsW>}RCaZPmlIAXT8&SUofecESKK++wzJ$WAqw)^sWVxslL2%r_iD)i zrO?lOPJ>s)Pkug&mm$;Xs2_&^0z=Z&1kJXzV3$k`*Dz~wK0_+0?X_7QHQ?QfO<`r_J>;uumw zYRc}uQz6jxky+W5Vf{u8tKD1eK!^Q zUAvC`N^04X6A(i6J->Qs_G=A%EbO{ba>`x#lsL&WH^1Aht_xxcq)$J{JyQa`xp$vY zpmS62{i%4Vd`1#UKk4pnwtNp}TDZ3kY&0DO=X}>Cuijyn$m0^pjxd^_&Qa+V)1Hcu zR^=w7dP@Wc9&ZRymJI+>4ZkQqb`-mZ=GPCrx!)ngPfg<${^grQE}ovqk1Uw7EICr? zW7aT@@hheDe$swdG`=GfxiX4tA~k z>WlDlwL>6W|I`okZFQ%`D2|1Uf8QNZ$>hve7u@X=C91y zG#Y9MK`?s867S!NOk<%5gGE4ev+@d6FWqEb`8NHWRj9&Uj)}X)&aFP!*$v%@<=KqI zL`2uG_PH?UN?XIwu|@ZUVd66Z5h;M|)kXN{qpvG?)NGpN=y%gJ#mB1-sdUAHi6RGI z{528_f2Jd7c4r?gwm*yrZ^Q|Pb7aKG*WU7g@prtYAMd^j(J_1ZQzn@DS0t(Y!a7%s zoFs5WY~QT75cfdgSUpy}XMPFj8qIm55grax-5cTEEXx_mZ+ ze|>`SCh<_Kc=W=0nt1qh1b>x|kS2e>OMyU)e?_0Q!6A7>C^1rI)Thf7f1Lk*n*TS@ z9DEi?k2<(~=}+L__cjoS@}G`)PpMEsbS&osP^V*+g`Cx>ti2rFyrH7!zyAgM?^^uJ zDH!kc5-O99?c4@U$BLhL8TFk`;7`waQ!J(&XUo@y@V|pc(xE~w(W7MOX^02t&z=4c DjdLHb delta 4215 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 T_}>y2FiMS?|3Wj}kI?@BJ=%K4