[python] par dotazu od zacatecnika v SQL

Petr Messner petr.messner na gmail.com
Pondělí Prosinec 25 12:59:33 CET 2017


Ahoj,

pymysql a mysqldb jsou db drivery - klientské knihovny pro přístup do
databáze, umožňují provádět SQL dotazy, transakce a tak.

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ů.

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.

Co se týče volby mezi mysqldb a pymysql, tak dnes bych asi volil pymysql.

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.

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:
https://www.python.org/dev/peps/pep-0249/

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.


Jinak bych tě ještě upozornil, ať se vyvaruješ *SQL injection*. Správný
přístup je použít v SQL zástupné symboly.a konkrétní data dodat "bokem":

self.cursor.execute('INSERT INTO values VALUES ('', NOW(), %s)', (row[0], ))

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:
https://github.com/messa/db-workshop-web-app/blob/dokonceno/anketa.py

A tady je varianta s SQLAlchemy:
https://github.com/messa/db-workshop-web-app/blob/sqlalchemy/anketa.py

Další čtení: :)

- https://blog.sqreen.io/preventing-sql-injections-in-python/
- https://www.fullstackpython.com/databases.html

PM

Dne 25. prosince 2017 11:41 Lubomir Vogl <python na vogl.cz> napsal(a):

> Ahoj,
>
> potreboval bych poradit s SQL. Hraju si s MariaDB a zajimalo by me :
>
> - 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
> - je ORM vhodne i na jednodussi projekty ?
> - 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
>
>
>  sql = "SELECT * FROM portal WHERE typ_id = " + str(typ)
>  self.cursor.execute(sql)
>  data = self.cursor.fetchall()
>  c = self.cursor.rowcount
>  for row in data:
>      sql1 = "INSERT INTO values VALUES ('',NOW(),0," + str(row[0]) + ")"
>      try:
>          self.cursor.execute(sql1)
>      except:
>          self.db.rollback()
> _______________________________________________
> Python mailing list
> python na py.cz
> http://www.py.cz/mailman/listinfo/python
>
> Visit: http://www.py.cz
>
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://www.py.cz/pipermail/python/attachments/20171225/3b3392d9/attachment.html>


Další informace o konferenci Python