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.mess...@gmail.com
<mailto: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/
<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 <pyt...@vogl.cz
<mailto: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 <mailto:python@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@py.cz <mailto:python@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@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