[python] par dotazu od zacatecnika v SQL

Petr Blahos petrblahos na gmail.com
Středa Prosinec 27 09:26:29 CET 2017


Ahoj, já si jenom dovolím doplnit, že když budeš dělat webovou aplikaci v
nějakém
frameworku, tak tam bude nějak vyřešen životní cyklus transakce, např.
v Pyramid+SQLAlchemy běžně tak, že v handleru máš k dispozici ORM session
(což je něco, pomocí čeho se s ORM pracuje), a automatický commit nebo
roll-back.

Dál, s SQLAlchemy nemusíš jet pomocí ORM, má také query language (QL),
kterým
sestavíš a spustíš dotaz - nějakej overhead tam samozřejmě je, ale je menší
než
u ORM. Já, když mám malé množství recordů, tak použiju ORM, když dělám
nějakej přehled, tak použiju QL.

Petr
--
http://petr.blahos.com/




2017-12-25 12:59 GMT+01:00 Petr Messner <petr.messner na gmail.com>:

> 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
>>
>
>
> _______________________________________________
> 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/20171227/1766a55e/attachment.html>


Další informace o konferenci Python