<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <p>Jsem stará konzerva a myslím si že začátečník by měl začínat
      jednoduše.<br>
      Vyhnul bych se SQLAlchemy a ORM.<br>
      Když jsem se snažil si zjednodušit život, většinou jsem si
      zavařil.<br>
    </p>
    <br>
    <div class="moz-cite-prefix">Dne 27.12.2017 v 9:26 Petr Blahos
      napsal(a):<br>
    </div>
    <blockquote type="cite"
cite="mid:CAE1QKmRAr+7cUp7kA3DtQKtzj5FMZmpn9hctEd61_BgAERWz3w@mail.gmail.com">
      <div dir="ltr">Ahoj, já si jenom dovolím doplnit, že když budeš
        dělat webovou aplikaci v nějakém 
        <div>frameworku, tak tam bude nějak vyřešen životní cyklus
          transakce, např. </div>
        <div>v Pyramid+SQLAlchemy běžně tak, že v handleru máš k
          dispozici ORM session<br>
        </div>
        <div>(což je něco, pomocí čeho se s ORM pracuje), a automatický
          commit nebo roll-back.</div>
        <div><br>
        </div>
        <div>Dál, s SQLAlchemy nemusíš jet pomocí ORM, má také query
          language (QL), kterým</div>
        <div>sestavíš a spustíš dotaz - nějakej overhead tam samozřejmě
          je, ale je menší než</div>
        <div>u ORM. Já, když mám malé množství recordů, tak použiju ORM,
          když dělám </div>
        <div>nějakej přehled, tak použiju QL.</div>
        <div><br>
        </div>
        <div>Petr<br>
        </div>
        <div>--</div>
        <div><a href="http://petr.blahos.com/" moz-do-not-send="true">http://petr.blahos.com/</a></div>
        <div><br>
        </div>
        <div><br>
        </div>
        <div><br>
        </div>
      </div>
      <div class="gmail_extra"><br>
        <div class="gmail_quote">2017-12-25 12:59 GMT+01:00 Petr Messner
          <span dir="ltr"><<a href="mailto:petr.messner@gmail.com"
              target="_blank" moz-do-not-send="true">petr.messner@gmail.com</a>></span>:<br>
          <blockquote class="gmail_quote" style="margin:0 0 0
            .8ex;border-left:1px #ccc solid;padding-left:1ex">
            <div dir="ltr">Ahoj,
              <div><br>
              </div>
              <div>pymysql a mysqldb jsou db drivery - klientské
                knihovny pro přístup do databáze, umožňují provádět SQL
                dotazy, transakce a tak.</div>
              <div><br>
              </div>
              <div>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ů.</div>
              <div><br>
              </div>
              <div>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.</div>
              <div><br>
              </div>
              <div>Co se týče volby mezi mysqldb a pymysql, tak dnes
                bych asi volil pymysql.</div>
              <div><br>
              </div>
              <div>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.</div>
              <div><br>
              </div>
              <div>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: <a
                  href="https://www.python.org/dev/peps/pep-0249/"
                  target="_blank" moz-do-not-send="true">https://www.python.org/dev/<wbr>peps/pep-0249/</a></div>
              <div><br>
              </div>
              <blockquote class="gmail_quote" style="margin:0px 0px 0px
0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">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.</blockquote>
              <div><br>
              </div>
              <div>Jinak bych tě ještě upozornil, ať se vyvaruješ <b>SQL
                  injection</b>. Správný přístup je použít v SQL
                zástupné symboly.a konkrétní data dodat "bokem":</div>
              <div><br>
              </div>
              <div><font face="monospace, monospace">self.cursor.execute('INSERT
                  INTO values VALUES ('', NOW(), %s)', (row[0], ))</font></div>
              <div><br>
              </div>
              <div>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: <a
href="https://github.com/messa/db-workshop-web-app/blob/dokonceno/anketa.py"
                  target="_blank" moz-do-not-send="true">https://github.com/<wbr>messa/db-workshop-web-app/<wbr>blob/dokonceno/anketa.py</a></div>
              <div><br>
              </div>
              <div>A tady je varianta s SQLAlchemy: <a
href="https://github.com/messa/db-workshop-web-app/blob/sqlalchemy/anketa.py"
                  target="_blank" moz-do-not-send="true">https://github.<wbr>com/messa/db-workshop-web-app/<wbr>blob/sqlalchemy/anketa.py</a></div>
              <div><br>
              </div>
              <div>Další čtení: :)</div>
              <div><br>
              </div>
              <div>- <a
                  href="https://blog.sqreen.io/preventing-sql-injections-in-python/"
                  target="_blank" moz-do-not-send="true">https://blog.sqreen.io/<wbr>preventing-sql-injections-in-<wbr>python/</a></div>
              <div>- <a
                  href="https://www.fullstackpython.com/databases.html"
                  target="_blank" moz-do-not-send="true">https://www.fullstackpython.<wbr>com/databases.html</a> </div>
              <div><br>
              </div>
              <div>PM</div>
              <div class="gmail_extra"><br>
                <div class="gmail_quote">Dne 25. prosince 2017 11:41
                  Lubomir Vogl <span dir="ltr"><<a
                      href="mailto:python@vogl.cz" target="_blank"
                      moz-do-not-send="true">python@vogl.cz</a>></span>
                  napsal(a):
                  <div>
                    <div class="h5"><br>
                      <blockquote class="gmail_quote" style="margin:0px
                        0px 0px
0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">Ahoj,<br>
                        <br>
                        potreboval bych poradit s SQL. Hraju si s
                        MariaDB a zajimalo by me :<br>
                        <br>
                        - 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<br>
                        - je ORM vhodne i na jednodussi projekty ?<br>
                        - 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<br>
                        <br>
                        <br>
                         sql = "SELECT * FROM portal WHERE typ_id = " +
                        str(typ)<br>
                         self.cursor.execute(sql)<br>
                         data = self.cursor.fetchall()<br>
                         c = self.cursor.rowcount<br>
                         for row in data:<br>
                             sql1 = "INSERT INTO values VALUES
                        ('',NOW(),0," + str(row[0]) + ")"<br>
                             try:<br>
                                 self.cursor.execute(sql1)<br>
                             except:<br>
                                 self.db.rollback()<br>
                        ______________________________<wbr>_________________<br>
                        Python mailing list<br>
                        <a href="mailto:python@py.cz" target="_blank"
                          moz-do-not-send="true">python@py.cz</a><br>
                        <a
                          href="http://www.py.cz/mailman/listinfo/python"
                          rel="noreferrer" target="_blank"
                          moz-do-not-send="true">http://www.py.cz/mailman/listi<wbr>nfo/python</a><br>
                        <br>
                        Visit: <a href="http://www.py.cz"
                          rel="noreferrer" target="_blank"
                          moz-do-not-send="true">http://www.py.cz</a><br>
                      </blockquote>
                    </div>
                  </div>
                </div>
                <br>
              </div>
            </div>
            <br>
            ______________________________<wbr>_________________<br>
            Python mailing list<br>
            <a href="mailto:python@py.cz" moz-do-not-send="true">python@py.cz</a><br>
            <a href="http://www.py.cz/mailman/listinfo/python"
              rel="noreferrer" target="_blank" moz-do-not-send="true">http://www.py.cz/mailman/<wbr>listinfo/python</a><br>
            <br>
            Visit: <a href="http://www.py.cz" rel="noreferrer"
              target="_blank" moz-do-not-send="true">http://www.py.cz</a><br>
            <br>
          </blockquote>
        </div>
        <br>
      </div>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">_______________________________________________
Python mailing list
<a class="moz-txt-link-abbreviated" href="mailto:python@py.cz">python@py.cz</a>
<a class="moz-txt-link-freetext" href="http://www.py.cz/mailman/listinfo/python">http://www.py.cz/mailman/listinfo/python</a>

Visit: <a class="moz-txt-link-freetext" href="http://www.py.cz">http://www.py.cz</a>
</pre>
    </blockquote>
    <br>
  </body>
</html>