<div dir="ltr">Ahoj,<div><br></div><div>pymysql a mysqldb jsou db drivery - klientské knihovny pro přístup do databáze, umožňují provádět SQL dotazy, transakce a tak.</div><div><br></div><div>ORM je knihovna, která uvnitř typicky používá ten db driver (v SQLAlchemy je součástí connection stringu informace, který driver se má použít) a umožňuje pracovat s databází "objektovým způsobem". Konkrétně SQLAlchemy je "filosoficky" založená na design patternech Data Mapper a Unit of Work, jiná ORM (myslím že např. to Djangové) mohou preferovat design pattern Active Record. To píšu proto, kdybys chtěl dál zkoumat, proč a jak to funguje a jaké jsou alternativy a výhody/nevýhody jednotlivých přístupů.</div><div><br></div><div>ORM může a nemusí být vhodné pro menší a větší projekty. Samozřejmě můžeš kombinovat ORM a SQL přístup. Některé dotazy je jednodušší zapsat přímo přes SQL, jindy je zase joinů anebo sloupců tolik, že ORM dost šetří práci. Nebo pokud chceš používat stored procedures a další funkcionalitu SQL databáze, tak asi budeš chtít přímo SQL.</div><div><br></div><div>Co se týče volby mezi mysqldb a pymysql, tak dnes bych asi volil pymysql.</div><div><br></div><div>Víc SQL dotazů samozřejmě můžeš dělat přes jedno spojení i přes jeden kurzor. Víc kurzorů potřebuješ, když chceš dělat SQL dotazy zatímco teprve zpracováváš výsledky jiného SQL dotazu. V tvém příkladu si ale ty výsledky nejdřív načteš všechny z kurzoru do paměti, takže je OK znovu použít ten kurzor.</div><div><br></div><div>Celá tahle abstrakce s kurzory by měla být v Pythonu pro všechny SQL databáze stejná, je to definované v PEP 249: <a href="https://www.python.org/dev/peps/pep-0249/">https://www.python.org/dev/peps/pep-0249/</a></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">These objects represent a database cursor, which is used to manage the context of a fetch operation. Cursors created from the same connection are not isolated, i.e., any changes done to the database by a cursor are immediately visible by the other cursors.</blockquote><div><br></div><div>Jinak bych tě ještě upozornil, ať se vyvaruješ <b>SQL injection</b>. Správný přístup je použít v SQL zástupné symboly.a konkrétní data dodat "bokem":</div><div><br></div><div><font face="monospace, monospace">self.cursor.execute('INSERT INTO values VALUES ('', NOW(), %s)', (row[0], ))</font></div><div><br></div><div>Kdyžtak tady je ukázka "jednoduché" webové aplikace používající sqlite (napřímo), vzhledem k podobnosti všech driverů (díky PEP 249) by to skoro takhle vypadalo i s MySQL: <a href="https://github.com/messa/db-workshop-web-app/blob/dokonceno/anketa.py">https://github.com/messa/db-workshop-web-app/blob/dokonceno/anketa.py</a></div><div><br></div><div>A tady je varianta s SQLAlchemy: <a href="https://github.com/messa/db-workshop-web-app/blob/sqlalchemy/anketa.py">https://github.com/messa/db-workshop-web-app/blob/sqlalchemy/anketa.py</a></div><div><br></div><div>Další čtení: :)</div><div><br></div><div>- <a href="https://blog.sqreen.io/preventing-sql-injections-in-python/">https://blog.sqreen.io/preventing-sql-injections-in-python/</a></div><div>- <a href="https://www.fullstackpython.com/databases.html">https://www.fullstackpython.com/databases.html</a> </div><div><br></div><div>PM</div><div class="gmail_extra"><br><div class="gmail_quote">Dne 25. prosince 2017 11:41 Lubomir Vogl <span dir="ltr"><<a href="mailto:python@vogl.cz" target="_blank">python@vogl.cz</a>></span> napsal(a):<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">Ahoj,<br>
<br>
potreboval bych poradit s SQL. Hraju si s MariaDB a zajimalo by me :<br>
<br>
- jaka je nejlepsi knihovna pro praci s SQL ? Zatim jsem nasel (PyMySQL, SQLAlchemy, MySqlDb) Chtel bych se naucit neco co bude mozne pouzit i na slozitejsi projekty<br>
- je ORM vhodne i na jednodussi projekty ?<br>
- pokud budu v SQL chtit pouzivat vice SQL dotazu, je to mozne udelat pres jedno spojeni (jeden cursor) nebo je nutne mit vice otevrenych spojeni ? Viz nasledujici priklad - jedno otevrene spojeni<br>
<br>
<br>
 sql = "SELECT * FROM portal WHERE typ_id = " + str(typ)<br>
 self.cursor.execute(sql)<br>
 data = self.cursor.fetchall()<br>
 c = self.cursor.rowcount<br>
 for row in data:<br>
     sql1 = "INSERT INTO values VALUES ('',NOW(),0," + str(row[0]) + ")"<br>
     try:<br>
         self.cursor.execute(sql1)<br>
     except:<br>
         self.db.rollback()<br>
______________________________<wbr>_________________<br>
Python mailing list<br>
<a href="mailto:python@py.cz" target="_blank">python@py.cz</a><br>
<a href="http://www.py.cz/mailman/listinfo/python" rel="noreferrer" target="_blank">http://www.py.cz/mailman/listi<wbr>nfo/python</a><br>
<br>
Visit: <a href="http://www.py.cz" rel="noreferrer" target="_blank">http://www.py.cz</a><br>
</blockquote></div><br></div></div>