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

Odpovedet emailem