[python] par dotazu od zacatecnika v SQL
zu1234
zu1234 na seznam.cz
Středa Prosinec 27 12:33:06 CET 2017
Jsem stará konzerva a myslím si že začátečník by měl začínat jednoduše.
Vyhnul bych se SQLAlchemy a ORM.
Když jsem se snažil si zjednodušit život, většinou jsem si zavařil.
Dne 27.12.2017 v 9:26 Petr Blahos napsal(a):
> 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
> <mailto: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/
> <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
> <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
> <https://github.com/messa/db-workshop-web-app/blob/sqlalchemy/anketa.py>
>
> Další čtení: :)
>
> - https://blog.sqreen.io/preventing-sql-injections-in-python/
> <https://blog.sqreen.io/preventing-sql-injections-in-python/>
> - https://www.fullstackpython.com/databases.html
> <https://www.fullstackpython.com/databases.html>
>
> PM
>
> Dne 25. prosince 2017 11:41 Lubomir Vogl <python na vogl.cz
> <mailto: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 <mailto:python na py.cz>
> http://www.py.cz/mailman/listinfo/python
> <http://www.py.cz/mailman/listinfo/python>
>
> Visit: http://www.py.cz
>
>
>
> _______________________________________________
> Python mailing list
> python na py.cz <mailto:python na py.cz>
> http://www.py.cz/mailman/listinfo/python
> <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/0280f79e/attachment.html>
Další informace o konferenci Python