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.mess...@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 <pyt...@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@py.cz >> http://www.py.cz/mailman/listinfo/python >> >> Visit: http://www.py.cz >> > > > _______________________________________________ > Python mailing list > python@py.cz > http://www.py.cz/mailman/listinfo/python > > Visit: http://www.py.cz > >
_______________________________________________ Python mailing list python@py.cz http://www.py.cz/mailman/listinfo/python Visit: http://www.py.cz