From fbf376a385173ba58e030c50670f4265b1d503ba Mon Sep 17 00:00:00 2001 From: alice Date: Mon, 26 May 2025 18:11:45 +0300 Subject: [PATCH] Freebies lab with modified files and README.md --- lib/.tables | 0 lib/__pycache__/database.cpython-38.pyc | Bin 0 -> 637 bytes lib/__pycache__/models.cpython-312.pyc | Bin 0 -> 2635 bytes lib/__pycache__/models.cpython-38.pyc | Bin 0 -> 1984 bytes lib/database.py | 22 +++ lib/debug.py | 18 ++- lib/freebies.db | Bin 20480 -> 24576 bytes lib/migrations/README | 127 +++++++++++++++++- .../__pycache__/env.cpython-312.pyc | Bin 0 -> 2643 bytes lib/migrations/__pycache__/env.cpython-38.pyc | Bin 0 -> 1691 bytes .../versions/7a71dbf71c64_create_db.py | 24 ---- ...f48c_create_companies_devs.cpython-312.pyc | Bin 0 -> 1741 bytes ...bf48c_create_companies_devs.cpython-38.pyc | Bin 0 -> 1043 bytes .../7a71dbf71c64_create_db.cpython-312.pyc | Bin 0 -> 695 bytes .../7a71dbf71c64_create_db.cpython-38.pyc | Bin 0 -> 678 bytes ...e446_create_freebies_table.cpython-312.pyc | Bin 0 -> 745 bytes ...9e446_create_freebies_table.cpython-38.pyc | Bin 0 -> 728 bytes ...l_migration_with_all_tables.cpython-38.pyc | Bin 0 -> 1306 bytes ...09cf_initial_migration_with_all_tables.py} | 23 +++- lib/models.py | 65 ++++++--- lib/query_data.py | 20 +++ lib/seed.py | 33 ++++- 22 files changed, 275 insertions(+), 57 deletions(-) create mode 100644 lib/.tables create mode 100644 lib/__pycache__/database.cpython-38.pyc create mode 100644 lib/__pycache__/models.cpython-312.pyc create mode 100644 lib/__pycache__/models.cpython-38.pyc create mode 100644 lib/database.py create mode 100644 lib/migrations/__pycache__/env.cpython-312.pyc create mode 100644 lib/migrations/__pycache__/env.cpython-38.pyc delete mode 100644 lib/migrations/versions/7a71dbf71c64_create_db.py create mode 100644 lib/migrations/versions/__pycache__/5f72c58bf48c_create_companies_devs.cpython-312.pyc create mode 100644 lib/migrations/versions/__pycache__/5f72c58bf48c_create_companies_devs.cpython-38.pyc create mode 100644 lib/migrations/versions/__pycache__/7a71dbf71c64_create_db.cpython-312.pyc create mode 100644 lib/migrations/versions/__pycache__/7a71dbf71c64_create_db.cpython-38.pyc create mode 100644 lib/migrations/versions/__pycache__/c9c6b699e446_create_freebies_table.cpython-312.pyc create mode 100644 lib/migrations/versions/__pycache__/c9c6b699e446_create_freebies_table.cpython-38.pyc create mode 100644 lib/migrations/versions/__pycache__/d0fde98209cf_initial_migration_with_all_tables.cpython-38.pyc rename lib/migrations/versions/{5f72c58bf48c_create_companies_devs.py => d0fde98209cf_initial_migration_with_all_tables.py} (56%) create mode 100644 lib/query_data.py diff --git a/lib/.tables b/lib/.tables new file mode 100644 index 000000000..e69de29bb diff --git a/lib/__pycache__/database.cpython-38.pyc b/lib/__pycache__/database.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..adaedb143e182428e10e03b12586a519de23a37f GIT binary patch literal 637 zcmYjOJ&zMH5VgG@N%l738X79v6v-9`4MK>V4yw}?+wuehb+FHkYg9U^0S^yXJocns2lxy9Qll|ovyV~t@DF`ujSe{KCaqM)ZyiSfgX@P-ay*Nm>jt!U&u|i zC2t8O@5ocKCEw_G#P87qR8B9(%;)nvk>|SR(kHdlHfU#}`aw*NWB!~KjaE=_+15}f zZQ5?hi&caAPm0yXHM*OuPA2#IC(iI1*DYjQ6@oh+_MEOZK3#%ai0VO57i1EeQbsdo zMu;!QxzErGF6#!=#xUgk=sz*lMwtl7^3eeapWXDpQWJ-U{A_kPJDts6Ew0|2`}FQJ t%peTx-T#M=Pf^tV;r)gOX&CzY&y^Ny2`_@B_83!6@vxZXY{XJLe*tG`qrm_G literal 0 HcmV?d00001 diff --git a/lib/__pycache__/models.cpython-312.pyc b/lib/__pycache__/models.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..408648a9386810276f8465f1d9a712521f87e336 GIT binary patch literal 2635 zcmZuzOK;mo5MGKDMbdis5xMaL?%K8ND2?s7c@!v$7E$^@(834;7ie@5C~_@Pp-6Q} z#a562F3>{*6exPip*`eUILH10=h}+}JCH*-hoVS<-dxy$0i%b`lA>w5UP8OGv$HeH znf*TM_f$$j&?eu$QoSc3^e3ByjqeJ3|AO!Y=}6~HROgBu$K;q9tMf(PmwAwdqTtJd z8Lx{)kwZkRr9)TISWJ*atv8y7(zpFFM7Xop*0{jR_b-}qT`4NyU#Sg-yQ8s~)MY*K zols1{D8ZNpzhZ4HvIwQMu0SQQNQE;Fwc;>OAD`!yznN{G^OPmSBsXnq$*91rpI8;c zBBdp2*GpQc6&ki}!fFCEE?IFGKo$zBL$ok58x!zj3Euk)x+lnmK4`Tt?V$ojoeNX& z2)Xfap(ch>G(JQwlrd;}Oy_mM;GV_Tgh0a`-|ZJZv<=4arLUnAmdTS=Y!+HVNksOn z#R3~hpZE@%M-I0ftt3@Fto+0;ou;tO-dZ>RtcN3jN)a(t>RkKaj}ZOy7Q%PuUa~`Y|vQvQ@<>iV2jwO0eqSWn!AM7#CXDxo0#QhE?$c2A;4+iGNyu%QC^bZB4tF z+$R>c2+`pbpA>G~zJ*;Im%-hA)i7Cv?wj0HO%u*yJx{apWb^0Lfd}FGnRweb;Y?GRcp3+dMT6f%*NxZnF)`^}M zJRX+3jH}WLaZ7dLs=Df`Udl9FLRGU=HZ0xolDeUqL~~1a!*v$&2~Q02?q&R4s$sDe zs1{{6&XbR-LfOsm`pN`gP;#kiIjY9&yfkfErKrexj`o11!*Glb3v*SwPUck8(8yff zW^b#`HL8G+D|3w&6wR7xT$x#-gp>_318%i@gwB~p8H{yeIFX%Ct>BIE`Ay}$)tfs)Pe;hMh3s}RvvYoWdvJJraN_Cb8`(>5DScce^58f!~qTM|CtL2LHxp{lV&{jP+aIp${4*i+3^Wn#I~Q6+V-(?p3J)DnqYqD z4+!S8z7_8hkNDv6S*&CIk92NX06Jg^M
4I6kNKsZA$BLP5n$S*!L8SAKyV{3-L z#vpD1k^ln%NgZRY5V$?ZfSZqbVuO+;W5tu%XG1f=*+hLDJwD^ zfDR7U(>(%XGCBl0hh18XDXX)WJqz$FS z?UAdS(zWf(=uZFOlbN4p_7lQ@xcbFz5-Hh^Jld8=H|4QiB*t@3FZ#$EYD+`gZ;k)< z@y6oUZ}^z3>`N$}?WCsKsj1D>1;C-4+er>|k`wLZ#8z?=AS&k$dccA2OVd%d)2SAgp( zvq6d}1DK~o1r18#Cp!U@S}z+~kYc||z1_mFKM^Iy(4H7D8f8S`Ng+Q6wO~}{=hMp= zPDpSiw&7Q_2W!YL#G&*dsG27Eh`tLt#tn`M-7e2@+$)rOjq_nIQDpK zRRmE`I{a{(AKu`nUJB{&?{_j&?ab7cF#RTpxbxdVX;w3Py;*L2@A3eb+r5N@k=6Hu XU0eLSIZe`{k)*r-3j zuU?@LhG3bIGtP38o4LiU+~zi;c{A(e4tH{wySc|bJ!j!wpZm-JU)XEL18~*`@BUkD99XI^V45W|nWq;JPm&r`C?P|$Eb3WWsj!B+Mk7zoK@OOTrV^4l z#88~21+4DXud;LwKa57BQwcChp&p9KlziC!U1#SB&Vs?2Ft{lgx4?#uFopGp$sN>P zjNYR;9DN9cO&P$oZWB2Vg^w`?$~`IbDk+xSpK1l4eR0WDw~}d|$Yp#EOXWUm98zwx zXL-qZZ<0*URb`9C-r6E7Y3$LDzW@QeeBul3-%1bIoGOA{n z^~a-XIiHoqLG}2cP2|B`qO%}JSvnaFal3%59#%``#j%7+#_=8U)I?#hRloIUxLF(z zBHBrA#IXwE7%y04q=#|*YLR5^N)*TQWRgK+O1e&3Bt9fTg_Czt@aVK$6aqbtmyk&5 z;+*QYnTI{|~VX@L^7K3KIr$8~O{qdW zyH%!8eoBXEhy0wx7bI@0LzDOr19*?5e}y+u@oLI`n{-M!&EKB#8LqxFdb%Rq+aRbZ)5^sF>tQNZVFNMh zE2(&^TvSrc*C8rz^A&k(B5!RREgU;I+BiCIs8hP*Rdm?)h?;7-iuQN0m*tu>M|&%8 zZ~r367I3uk_jf7b?Vb(jiTmt$(9uj${`FDS(Z`h2oKeBefm`wM2>svSqu)ApjS*ch z`896Qpw*0#U!pl4+<9;Cd_%_{kf0_fACmZ%gr+RfS?-ePk+?yy)-;TXIrL~vK)+@% z>#?5gbwZ}=I3Db%0RIw_Y&wH{xrJigNa$tWyICKWGM5fcYE(;)G-?vcY5rc6{Ui3q iCSJm!`^{#vX literal 0 HcmV?d00001 diff --git a/lib/database.py b/lib/database.py new file mode 100644 index 000000000..181385972 --- /dev/null +++ b/lib/database.py @@ -0,0 +1,22 @@ +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from sqlalchemy.ext.declarative import declarative_base + +DATABASE_URL = "sqlite:///freebies.db" + +engine = create_engine(DATABASE_URL, echo=True) + +SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) + +session = SessionLocal() + +Base = declarative_base() + +def get_db(): + db = SessionLocal() + try: + yield db + finally: + db.close() + + diff --git a/lib/debug.py b/lib/debug.py index 4f922eb69..634568b54 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -1,9 +1,17 @@ -#!/usr/bin/env python3 - from sqlalchemy import create_engine - +from sqlalchemy.orm import sessionmaker from models import Company, Dev if __name__ == '__main__': - engine = create_engine('sqlite:///freebies.db') - import ipdb; ipdb.set_trace() + engine = create_engine('sqlite:///freebies.db') + Session = sessionmaker(bind=engine) + session = Session() + +import ipdb; ipdb.set_trace() + +companies = session.query(Company).all() +print(companies) + + #!/usr/bin/env python3 + + diff --git a/lib/freebies.db b/lib/freebies.db index 12beb1c963e832db481e7a7493e3029e691ac4dc..34b41acf4ab7868a09acc94badb9865210a576ff 100644 GIT binary patch delta 528 zcmZozz}Rqrae}lU2Ll5G8xX?)%S0VxaSjH(vQA$99}KL#oDBTD{5$#T`J{L`H#Sb@ zF=^ssWfzx~Wo*tbNleN~O)E-GP0CCyhS6-!L9UJ=t_mTJPCl**P|?Ybd@@d%C8@db zd5O8H3So{x&K{0IItpBzWr;bZsS2KcA+GMOV1bm>viQstWRc|j+=9fsN}%ZE_k1$R zAYE?$L9U+eehS{Mks1hTO@$y=H`gFnKWEoq1&A=vVG0_VDVpe-Ahw`r0183Wa%pas z;=3itlVXsTl4@yTWMG+`wn^a&zZ9|nFEG5A`A;+OzvaKne|oc^z+Qf50cI8kMW&L( zqQvaXl+?r=_Gf%dEDW+tKB?)MAm^|@5M*RwP-b!g*%Vw@npl*|ejQ@aLk9kD{BQUl z0u8#%ug}TM%pe(@m{*ct%)!LWARb&=oS4VK2xKJ}1@nAOkfUUL24ck6B8FB Mh{wt4oLImF0H%M6WdHyG delta 120 zcmZoTz}T>Wae}lUD+2=q2*UvLL>*&MRtCLzSzi7h3@m(74E((OJNfGQq&5o*EaTlQ r#dk}P$285{DB08^Db2(pd6U8yej#K5UXW1&K-Ks8Cr*%NL*)VhkJ1_o diff --git a/lib/migrations/README b/lib/migrations/README index 98e4f9c44..b5c5e93de 100644 --- a/lib/migrations/README +++ b/lib/migrations/README @@ -1 +1,126 @@ -Generic single-database configuration. \ No newline at end of file +A SQLAlchemy-based application that models companies giving out freebies to developers. This project demonstrates relational modeling, CRUD operations, database seeding, migrations, and querying with SQLAlchemy. + +## Project Structure + +freebie-tracker/ +│ +├── lib/ +│ ├── alembic/ # Alembic configuration +│ ├── migrations/ # Alembic migration scripts +│ ├── alembic.ini # Alembic settings file +│ ├── models.py # SQLAlchemy models: Company, Dev, Freebie +│ ├── seed.py # Script to populate database with sample data +│ ├── debug.py # Interactive debug script using ipdb +│ ├── query_data.py # Custom queries and data fetch logic +│ ├── database.py # Database setup and session configuration +│ ├── freebies.db # SQLite database (main data store) + + +## Models Overview + +### Company + +- Columns: `id`, `name`, `founding_year` +- Relationships: has many `freebies` + +### Dev + +- Columns: `id`, `name` +- Relationships: has many `freebies` + +### Freebie + +- Columns: `id`, `item_name`, `value`, `company_id`, `dev_id` +- Relationships: belongs to `company`, belongs to `dev` + +## Setup Instructions + +1. **Clone the repository** + +```bash +git clone https://github.com/your-username/freebie-tracker.git +cd freebie-tracker/lib +(Optional) Create a virtual environment + +bash +Always show details + +Copy code +python3 -m venv venv +source venv/bin/activate +Install dependencies + +bash +Always show details + +Copy code +pip install -r ../requirements.txt +Run database migrations + +bash +Always show details + +Copy code +alembic upgrade head +Seed the database with sample data + +bash +Always show details + +Copy code +python seed.py +Run debug console + +bash +Always show details + +Copy code +python debug.py +Features +SQLAlchemy ORM relationships + +Alembic migrations + +Data seeding with clear logs + +Custom querying in query_data.py + +Centralized session handling in database.py + +Debugging with ipdb + +Sample Output +Running seed.py will clear the database and insert: + +Companies: Devs Square, Legicomp, tarakideal + +Developers: crocs, Susan, Santos + +Freebies: Cap, Pen, Mug, Water Bottle + +Example debug output: + +python +Always show details + +Copy code +[, 976d$d$T1nmye`MYG12cBBb~cT@alQ(rG{or#X^RQLg=Q~{RvPbWqm{NJ zt?dm7xX?obh0;?F?V;D=9QzMAr$R4Y?68h-4yB~fn~M_+riZ?fR+jC0#Lm2V^X9$L zd-MBge@~?p1a1Gf%hmf5LVvPJ*!Zrn_b&)fkdAcDM0KvnaZHYxu{vMmeVGSYC)Ow?ND1F@@LxekhZH)`8eE*^;*Oj6I{*~HbxH}q)NnO?x z-w4GNj1r7#@GI8FB8yO3>k3o?i&Qw{P%94e^wD`<`J371IZs(MOmfS%7L5wb`iWIB zEK*vecDWo z9w9d#F4V+OipGb?g)#|tB5bjn zm1?BH;8E2y(s0$XN&H<^LJ3wKyi81U2IILFcJ3REhGA9wfPp8hQR1K0-?B`wZd+3> zCQHP^79l#E;={R{cWz_X#$|A~q#7oR(0!9zs%gUc?eO?BWQAx=mz>XIKRl@$t{<&p zFprK){qQ!^`4JtB8VwiQO}Ei>yG|dZov%#Q)T*T3nrTvV!BZM4RqKx1GKm+r)H>1g zg2%&>mvL2EA#SNoTvbp=%7&#oUQ#zylW1!OEoOE z0@b4I#(DB#RVcd|USF923`#ClEl1UuotLIfs}vPE&(R*RbQq5D!Ka0)T_*+AG&EAE z+w5)CLZb=@xl(AfplH@~hCEC$wN1fZ0Eb8g&D7dZQjq%w{<=IV0QN4QA>?*pgHY`d)`z=}uATz*wXPSPiy&V+1=LStYkc7I5qgMfsmOmQ zg`9#T-W)hLg*RjBHDK*w1~zi!ZFKJ_&c-&Vu`aSB9@c$R{SK< zeAgck%}ISL-X$RM!Q<1|$NC@n+_nIGz!r{1ER`BI@I!!fhGIqrfbx)Me26mkQ60zD z41bM5-2y}b76P(5!d@YOdyW7&AM?ZpC5y(2C$rCoW`eVYJnt!yqX29fN-UkwlIoPo zs;gD!^GV9sowEFUJq)n$rSU=7AK>^WE zWI6yH9IU5%1jcA|2y_m+v=~!XXD@pafPOM5hPCVPbAE&l@Rvpdxg9Cpk%rsS@K4t} zBUjraS2v|=+nLdw{=p~HKTN+)2m|8kXS+$HWIOU`TOQq%$99nz&;5MCN8V6d8rptq z{MQ>B3tztBW3uvELg{QLHQ7#0Zl=xy4&~fVa-fr(XeTGOlIH-Ta&Er|9Qa=L6`1Za zqk~9!;GBc=t*2+_X8H9S*|}W&*%=AsXSw*?jQs3Eg2}V-x%U#RLX@~oYR%_+y|igp zfb%LdL5e8@n5RSq4NBrCI|0;MFB@8rV!ukg-NLXx6D7vfp2$9Yrb8J~cv8sIK`j`S z`T6uRh7%H8iEa1=?ZF!I3vnR552~g~KA`V_j&XxyLbuCv9QP9CUZMO;H1Z0K>`Fjv z-;X^WTNObRlny`K=7%@<$rnQU+oeusvYnaS5~kiH5qEYwD9vhSuQ$t$?_C<;a=RCi cFtYk?uxpDSeIX1#7e@aOhMo%}^a2F@4|)A()&Kwi literal 0 HcmV?d00001 diff --git a/lib/migrations/__pycache__/env.cpython-38.pyc b/lib/migrations/__pycache__/env.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc68b1d2145d707c6db3651e007dfd7ea7fd2b08 GIT binary patch literal 1691 zcmZvc&2J+$6u|A7$xJdy(+}9yiUasoBB3Cy1g8~RT0mNas-<)VijYRm*h!pvJXzb* zk5zkG4sfVe;>;mE@}KZG%#{;=0TKeivnScMz(nIb``Pcq@Au}}#zu+-vN;{gPLYmM*p<$^qaJIqC4G4RD=Kgyj3BnusaPcDR}f#j}Yni!5KSMvJnPpiN-K@-uq?a9 zeSp41hv*x`VhA^(pMlZCN|8cLHMOEth6qJ=%gIDSz`LX<86T!8f#+x@3~7R|G&jV~ zxSP7j$*Hh2GOvs!lsr59!tbYw5mmy9BA@#7--9D%HJ#n85U@z|oG&aLOYTq2xaNc! za>}I~60&zr%&}N3gqnJXjU|$6?xXcbPB~$v+O>qAa77g745IjC@8hRWh%Lz&%$-mn zorhH>`&3GZzg&ku%C2dvuLdL?n}4kJ(^sLg(YQW7nNNZebG11 zC6)P%7w5xD%cDA7P)!SC&n2&0iWZy=qB;asy=keQa+?+0QbsMUH>9v!Q<;s0Vy5mf zK_$;^RxYeL7$kMv+b|a2c2nd5 z)~?ZhM*0o-`(yh?^FCK6!^L@h|L%coMa0{%-R!`CdMS=@;D7O-agt(v4_5C08^D5d z2atTog)A{z3O*W=BpB)T(I)r=EeHiMl zE52zQ*E>zkGoi$KO-F85`=FBYDY)_96&I(6L~l7e4iCNU23JD}th)-qb%%c76b^`H zcoU@h-oH8U_xT~H%v&&^B)};^5d9U$9taem;O{sB9Nq!#U~ANu None: - pass - - -def downgrade() -> None: - pass diff --git a/lib/migrations/versions/__pycache__/5f72c58bf48c_create_companies_devs.cpython-312.pyc b/lib/migrations/versions/__pycache__/5f72c58bf48c_create_companies_devs.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..32b98b65df79aeeb98bd62d7cbad3ed3c240a253 GIT binary patch literal 1741 zcmd5+&1(}u6yJ}@?q*Fyu_`KPR1kuu+oVlfqj<1Is2^3-gXFSob|%g0emT3TqR^(@sg z)oMp9W@oON7#Sfdn4aSsu7!d_1&F2tRXvZUt-$i!!o+y3P;HJ>%<5>PIW%g$P>Zy zCrK`iOmb;NvzKM07#WlXu6vv&KhK4HvUxcnBUzvt@?j>KUX~JTMMELAudJ*m)QG~YCpQT*ej9Ch|)hJ$|=OPVq6_Dmz=z!p|H?nZK1~wzaEcDDu&gv z{@-|9J8KYg!E+t1n4Kiq<&r0Y1y9h5RNS_08x0!~;2I9PNb*gu?Ly0)(mTk&1hCF1 z%9xb|$;FMMhmnI27(^QL?6%_)dBP3R6v9Nh5Mt^~`p#j?F>vP;>Wq1A5Msk}!>3%A z#q$$uEzd!kVOu8B9FI8|n%^=4G^qKVu;sZWf3VcV2sJEJqQ2%8gf-i0XpS|7jgYoz zpiLvpdNt6}?WFf2T+UNx@%Q^3BDa0&3K8B$BiKSm@QjLC?lX{Xo}D{;`_xBjOw3K( zg7=QkpS*MO?&&AhMNm#woA(;?)*b8al_%q=RqqjgJo8}Y;q@1A5geiaz5}~ngI)K> z-+;YK*-S=S%5fPv!atE9{Ud$~>AMUv67Hkn{_#GrD`BI1iHh~#holqM?SSQ;iK<4N z#H_@yOhr+M>p+Fr^W!SOjLIlByp>uc3%zS@O!N*q-%m%dlZu$=GjnHdA6NuC7#GYw z_!jJroQndHFbdn)oh)u3vaUnV)O8{oHgX!4**iA4Y8$rMLQV&7WQQrZ_h6GeJ62zr zHn8EEEuB_2vIC+*Ugkiqhoj<-DS^4P@&?h$n*R+LE^#p qjU2!I1GoLF!sT|(D(^S#p3T4C)JH{r^Q_vHa=f%u5cxe(LcakWEMvm} literal 0 HcmV?d00001 diff --git a/lib/migrations/versions/__pycache__/5f72c58bf48c_create_companies_devs.cpython-38.pyc b/lib/migrations/versions/__pycache__/5f72c58bf48c_create_companies_devs.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce49fc8b6fd70c6f7a0bdd2f120b20da4514ef5f GIT binary patch literal 1043 zcma)5&2G~`5caMe+i??AN`*LD;uMMC{5B;*2q_h!LaGpji!av3yJ-ye+TC@E!Vz)h z4LCGM-h^k^D<_@+34vhzqc##8*wv1AW@kR{e4qWQ-F7q>-@go&zjaOfS~%MSV%lR^ z@+laq`5HwO$0)%*M#Wx_b>EJJ(scz={PUgMI@t?yT?aUcf6Pk!tvpJF**#Z6DFtbgiQK$zL@mG zgOM|JEB?VYfHz_Q!62JnbD!2fh0bMx*iJf#ZCG2DA=RIL%J{);6-=+D3#F zQ?Ps`cvw_ykAkWhEcqTxu3aLEa{OASILDX9MuSF;k9rwtK%@Z?^D1K1Id$aHqG>t}2|OS#MiiFp256T5&@ znjgYjrU~;%9EHqF(xQrZ*^)>$^s;rnOnEmOb{B%NdBnN^5WZo;i=(-hL}!BJpt|%f zm?-3z-nK$Pea)+8gQAK1*;-kv3`!}xRmgH1jD}6LS5EtEA0;=6jNK;LkzUAe`?t&|eQVlyu?8CFO zqpTpHX&3~`A~8$mQCOqO^O(fpk|k@g1DVPe_1~b{1z>RP&IRG&G611jER{o9#yFKh j%F9m6_x$r>_QNEltC&4PfG-Q}46B7~!$9TKZ|wd7?c5Cm literal 0 HcmV?d00001 diff --git a/lib/migrations/versions/__pycache__/7a71dbf71c64_create_db.cpython-312.pyc b/lib/migrations/versions/__pycache__/7a71dbf71c64_create_db.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c8e080d34a9ce1b71bb82546fec441250b9637e1 GIT binary patch literal 695 zcmaJJy`_~yIs3Q(eE$bz@ zELhRh&WrQNS)!$n)AiEN7Egy2!Xn3dKFH6-p2(Tc=7Bp4Tt9UDFq(x?7@mgyViEY3 z^;MdjLasFJiXY#vmL2T>394W_O~4iC!8Kf618T@mQgFBS@}?plDvOMGRYQyV0(otY z7zw<#@A9U0+rV8@Lehe`9Yxt2LcOv`y{fpNs1yA#?~+j281wG?NQTxEoSwElH#V)1 zV?yPQnI|GTETknCL#Aa~HQ06xaeyLzZ>i+my%jwDFQRN*=$-G8nu5GEzrlGV5<(4nhV4~i_ivH>9|0whDbWM~ke&>~PeIuc6#l$2Ara~`8F zkT>ZwaP8D5DA1`VIfb?Li2HCKc|3l{yPMBlg7*8zs<@+s{OrltOeB}+>OBIGga8FY z(8@>*+Q+6a6AP?l0%kHrx6vIiVe*~A6zoSUnLRTHX2@JHZ^^>__9>T~b=-r@bwBcl zQk6~ZeYlRjE!&2W?Y3dQd3!wJD)!u~WBN7TiM`cwwf2{5Ka9LEikDFwMdwkt*{nm? z{e?Qof@-5_Z}i!?8g5P{@Ak6J`<$_1=i~}qSqMOG$rHVKB65oC1b=ox(NsKOqRe?v zHL|SlS##)?JaF0fs)Dh!^!OVo zWasTc+xr&Nfxqq*83=?*2l4;1m7pY(w7fQRpTV8`on|cs0`)5Xi fhQA$DITuv}d%@rJQ&6uEEc=W)mPLnUzO?=V%NL$? literal 0 HcmV?d00001 diff --git a/lib/migrations/versions/__pycache__/c9c6b699e446_create_freebies_table.cpython-312.pyc b/lib/migrations/versions/__pycache__/c9c6b699e446_create_freebies_table.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72895b64f1b09fcf43de8001d518b8ef605d860c GIT binary patch literal 745 zcmaJ;y>8nu5GEzrk`+5h(E{lYP-ykw$dzm-Hi800vvl#$QHwy4OeB>0DJiFLCl7gt zJVTzPFA%Uxfll30xLq=plpWOQ&;$70o$mPQzT=l(&jre^UWDlz1Ay;3c`%hXwmwzv z8W0cx0*S$3ZbSyuvB}KHB39HQt*A}R$X3T84ryOmQAc@Od3R~{JD;n!oT8d~=bX|c zqr$6E!l>)Mr8nu5T<@?$%cNpK$xdt(MT=x;mkbTMXb~v#90{d1CJlSyZbtuc?9k8O_YB$3HjB5p;-t%psP<9I7tXMxG9X% zOiZK8Eny`#x04YcC1Y+S4!X-NKK^NNhr5qAMaWi{*)G0h-jU`Sxwd||3|EWg zY7wsdx9e@R+{W>FbP-1DrRV)d{bX)vvu5y4Zhm2SeS&H2{EOM@&7Hz5tg0Q4>AWY z^n};ntDgEb!e{CU=JPY{q$#ginrep%D6@je?rZI-dqD-up*(0)QSHj(PW7x~OHVM9 zv|@QGXa+)Qk3$0$S7}}K;$`>EKu|yDUX}Z8m?^{{jpw*{{m&e Bt-}BS literal 0 HcmV?d00001 diff --git a/lib/migrations/versions/__pycache__/d0fde98209cf_initial_migration_with_all_tables.cpython-38.pyc b/lib/migrations/versions/__pycache__/d0fde98209cf_initial_migration_with_all_tables.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8424aba6f4c6f922d74a945d4c03c6d031f4cc88 GIT binary patch literal 1306 zcma)6&5qMB5RQ{HNkhA=00H6@aVt_c-7YL_g%HxN5G$k=V&T$D>lhJK+OHjAm-ex{vfyU!C#TZ1K+^(^ccSqdn?`f&5qpJJEmZpn z{?AWy%56@y|8Xk35dG5m=#X>gf~I?3bL^Au6p^(lTABO#qyy6BMyj)KL(MIy-}-@W zr+HRj!Kl(UBTwKF12N~^luo+>XY{4+9_4dEn3yI@iluf5T__zKNlGW?SeunJON^;* zEij)`?SVzYhz@JtOW@ykPU38UYr4Q(YC_c+s*kr6WZSwC7n{K zy~9#M4*J@2$ucaL&**YD7pjz)iBeyCl1s{_;+*!2C9i|`iv0Kx&+?4Mn6s3|S#Esc zxR_x@x8h=1&T`Q&w))Mj`rtNwLuJg_BtC(*iWgKGB&+x=@Df({KyqT3m>x)=2kHx{ zjbf?&c>x_l=v9NmJ3uVkLszO9{B*sV4}Q6=KU%Z51~d3BZ-Vs&P@9&nKz$pS8q_P) z01P17aE{@sV!H>@{1LKkhzq1=*N-0(nHP1Yr|(sBH^5A{N&Ze$x%WX-9uUh8QHbO% z;Ch#|pClwtlSKQN(`>@h#;adILqZEG lh)Qx%UA>C)*VKZCSx)AhK7zislnLVc9Td1Os;0Ac>o*;~S)u>{ literal 0 HcmV?d00001 diff --git a/lib/migrations/versions/5f72c58bf48c_create_companies_devs.py b/lib/migrations/versions/d0fde98209cf_initial_migration_with_all_tables.py similarity index 56% rename from lib/migrations/versions/5f72c58bf48c_create_companies_devs.py rename to lib/migrations/versions/d0fde98209cf_initial_migration_with_all_tables.py index c191bb2f9..ec7babb17 100644 --- a/lib/migrations/versions/5f72c58bf48c_create_companies_devs.py +++ b/lib/migrations/versions/d0fde98209cf_initial_migration_with_all_tables.py @@ -1,8 +1,8 @@ -"""create companies, devs +"""Initial migration with all tables -Revision ID: 5f72c58bf48c -Revises: 7a71dbf71c64 -Create Date: 2023-03-15 15:06:20.944586 +Revision ID: d0fde98209cf +Revises: +Create Date: 2025-05-26 17:10:12.764692 """ from alembic import op @@ -10,8 +10,8 @@ # revision identifiers, used by Alembic. -revision = '5f72c58bf48c' -down_revision = '7a71dbf71c64' +revision = 'd0fde98209cf' +down_revision = None branch_labels = None depends_on = None @@ -29,11 +29,22 @@ def upgrade() -> None: sa.Column('name', sa.String(), nullable=True), sa.PrimaryKeyConstraint('id') ) + op.create_table('freebies', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('item_name', sa.String(), nullable=True), + sa.Column('value', sa.Integer(), nullable=True), + sa.Column('dev_id', sa.Integer(), nullable=True), + sa.Column('company_id', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['company_id'], ['companies.id'], ), + sa.ForeignKeyConstraint(['dev_id'], ['devs.id'], ), + sa.PrimaryKeyConstraint('id') + ) # ### end Alembic commands ### def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('freebies') op.drop_table('devs') op.drop_table('companies') # ### end Alembic commands ### diff --git a/lib/models.py b/lib/models.py index 2681bee5a..9b06689b8 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,29 +1,56 @@ -from sqlalchemy import ForeignKey, Column, Integer, String, MetaData -from sqlalchemy.orm import relationship, backref -from sqlalchemy.ext.declarative import declarative_base -convention = { - "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", -} -metadata = MetaData(naming_convention=convention) +from sqlalchemy import Column, Integer, String, ForeignKey +from sqlalchemy.orm import declarative_base, relationship, sessionmaker -Base = declarative_base(metadata=metadata) +from sqlalchemy import create_engine +engine = create_engine('sqlite:///freebies.db') +Base = declarative_base() class Company(Base): - __tablename__ = 'companies' + __tablename__="companies" + id = Column(Integer, primary_key=True) + name = Column(String) + founding_year = Column(Integer) - id = Column(Integer(), primary_key=True) - name = Column(String()) - founding_year = Column(Integer()) - - def __repr__(self): - return f'' + company_freebies = relationship("Freebie", back_populates="company") + def __repr__(self): + return f"" + class Dev(Base): - __tablename__ = 'devs' + __tablename__= "devs" + id = Column(Integer, primary_key=True) + name = Column(String) - id = Column(Integer(), primary_key=True) - name= Column(String()) + dev_freebies = relationship("Freebie", back_populates="dev") def __repr__(self): - return f'' + return f"" + +class Freebie(Base): + __tablename__ = "freebies" + id = Column(Integer, primary_key=True) + item_name = Column(String) + value = Column(Integer) + dev_id = Column(Integer, ForeignKey('devs.id')) + company_id = Column(Integer, ForeignKey('companies.id')) + + + + def __repr__(self): + return (f"") + + + dev = relationship("Dev", back_populates="dev_freebies") + company = relationship("Company", back_populates="company_freebies") + + + + + + + + + + diff --git a/lib/query_data.py b/lib/query_data.py new file mode 100644 index 000000000..f5eadb38c --- /dev/null +++ b/lib/query_data.py @@ -0,0 +1,20 @@ +from models import Dev, Company, Freebie +from database import session + +print("\n---- Deveopers----") +devs = session.query(Dev).all() +for dev in devs: + print(f"Dev ID: {dev.id}, Name: {dev.name}") + +print("\n--- Companies ---") +companies = session.query(Company).all( +) +for company in companies: + print(f"Company ID: {company.id,} Name: {company.name},Founding Year: {company.founding_year}") + + print("\n--- Freebies ---") + freebies = session.query(Freebie).all() + for freebie in freebies: + print(f"Freebie.ID: {freebie.id}, Item: {freebie.item_name}, Value: {freebie.value}, Dev: {freebie.dev.name}, Company: {freebies.company}") + + session.close() \ No newline at end of file diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..abfc240ed 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,32 @@ -#!/usr/bin/env python3 +from models import Dev, Company, Freebie +from database import session + +from models import engine + +session.query(Freebie).delete() +session.query(Dev).delete() +session.query(Company).delete() +session.commit() + +dev1 = Dev(name= "crocs") +dev2 = Dev(name= "Susan") +dev3 = Dev(name= "Santos") + +company1 = Company(name="Devs Square", founding_year=2007) +company2 = Company(name="Legicomp", founding_year=2016) +company3 = Company(name="tarakideal", founding_year=2022) + +session.add_all([dev1, dev2, dev3, company1, company2, company3]) +session.commit() + +freebie1 = Freebie(item_name="Cap", value=2, dev=dev1, company=company1) +freebie2 = Freebie(item_name="pen", value=12, dev=dev2, company = company2) +freebie3 =Freebie(item_name="mug", value=6, dev=dev3, company=company1) +freebie4 = Freebie(item_name="Water Bottle", value=2, dev=dev3, company = company2 ) + +session.add_all([freebie1, freebie2, freebie3, freebie4]) +session.commit() + +print("Seed added successsfully!") + -# Script goes here!