<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<p>Jsem stará konzerva a myslím si že začátečník by měl začínat
jednoduše.<br>
Vyhnul bych se SQLAlchemy a ORM.<br>
Když jsem se snažil si zjednodušit život, většinou jsem si
zavařil.<br>
</p>
<br>
<div class="moz-cite-prefix">Dne 27.12.2017 v 9:26 Petr Blahos
napsal(a):<br>
</div>
<blockquote type="cite"
cite="mid:CAE1QKmRAr+7cUp7kA3DtQKtzj5FMZmpn9hctEd61_BgAERWz3w@mail.gmail.com">
<div dir="ltr">Ahoj, já si jenom dovolím doplnit, že když budeš
dělat webovou aplikaci v nějakém
<div>frameworku, tak tam bude nějak vyřešen životní cyklus
transakce, např. </div>
<div>v Pyramid+SQLAlchemy běžně tak, že v handleru máš k
dispozici ORM session<br>
</div>
<div>(což je něco, pomocí čeho se s ORM pracuje), a automatický
commit nebo roll-back.</div>
<div><br>
</div>
<div>Dál, s SQLAlchemy nemusíš jet pomocí ORM, má také query
language (QL), kterým</div>
<div>sestavíš a spustíš dotaz - nějakej overhead tam samozřejmě
je, ale je menší než</div>
<div>u ORM. Já, když mám malé množství recordů, tak použiju ORM,
když dělám </div>
<div>nějakej přehled, tak použiju QL.</div>
<div><br>
</div>
<div>Petr<br>
</div>
<div>--</div>
<div><a href="http://petr.blahos.com/" moz-do-not-send="true">http://petr.blahos.com/</a></div>
<div><br>
</div>
<div><br>
</div>
<div><br>
</div>
</div>
<div class="gmail_extra"><br>
<div class="gmail_quote">2017-12-25 12:59 GMT+01:00 Petr Messner
<span dir="ltr"><<a href="mailto:petr.messner@gmail.com"
target="_blank" moz-do-not-send="true">petr.messner@gmail.com</a>></span>:<br>
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<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/"
target="_blank" moz-do-not-send="true">https://www.python.org/dev/<wbr>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"
target="_blank" moz-do-not-send="true">https://github.com/<wbr>messa/db-workshop-web-app/<wbr>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"
target="_blank" moz-do-not-send="true">https://github.<wbr>com/messa/db-workshop-web-app/<wbr>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/"
target="_blank" moz-do-not-send="true">https://blog.sqreen.io/<wbr>preventing-sql-injections-in-<wbr>python/</a></div>
<div>- <a
href="https://www.fullstackpython.com/databases.html"
target="_blank" moz-do-not-send="true">https://www.fullstackpython.<wbr>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"
moz-do-not-send="true">python@vogl.cz</a>></span>
napsal(a):
<div>
<div class="h5"><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"
moz-do-not-send="true">python@py.cz</a><br>
<a
href="http://www.py.cz/mailman/listinfo/python"
rel="noreferrer" target="_blank"
moz-do-not-send="true">http://www.py.cz/mailman/listi<wbr>nfo/python</a><br>
<br>
Visit: <a href="http://www.py.cz"
rel="noreferrer" target="_blank"
moz-do-not-send="true">http://www.py.cz</a><br>
</blockquote>
</div>
</div>
</div>
<br>
</div>
</div>
<br>
______________________________<wbr>_________________<br>
Python mailing list<br>
<a href="mailto:python@py.cz" moz-do-not-send="true">python@py.cz</a><br>
<a href="http://www.py.cz/mailman/listinfo/python"
rel="noreferrer" target="_blank" moz-do-not-send="true">http://www.py.cz/mailman/<wbr>listinfo/python</a><br>
<br>
Visit: <a href="http://www.py.cz" rel="noreferrer"
target="_blank" moz-do-not-send="true">http://www.py.cz</a><br>
<br>
</blockquote>
</div>
<br>
</div>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<br>
<pre wrap="">_______________________________________________
Python mailing list
<a class="moz-txt-link-abbreviated" href="mailto:python@py.cz">python@py.cz</a>
<a class="moz-txt-link-freetext" href="http://www.py.cz/mailman/listinfo/python">http://www.py.cz/mailman/listinfo/python</a>
Visit: <a class="moz-txt-link-freetext" href="http://www.py.cz">http://www.py.cz</a>
</pre>
</blockquote>
<br>
</body>
</html>