<div dir="ltr">Ahoj,<div><br></div><div>nejzásadnější problém, který tam vidím, je zranitelnost proti SQL injection:</div><div><br></div><div><a href="http://xkcd.com/327/">http://xkcd.com/327/</a><br><div><br></div><div>Místo celého Template prostě ty parametry předej do execute:</div>

<div><br></div><div><a href="http://initd.org/psycopg/docs/usage.html#query-parameters">http://initd.org/psycopg/docs/usage.html#query-parameters</a><br></div><div><br></div><div>Doporučuji podívat se na SQLAlchemy (<a href="http://docs.sqlalchemy.org/en/latest/">http://docs.sqlalchemy.org/en/latest/</a>). Skládá se ze dvou částí: ORM a Core. Core řeší jednotnou práci s databází v Pythonu pro více typů databází (PostgreSQL, MySQL, MS SQL, Oracle). Až začneš řešit, že placeholdery v query pro parametry jsou někde "?" (např. SQLite) a jinde "%s", tak přesně s tímhle ti to pomůže. Nebo třeba connection pooling nebo introspekce. No a ORM je ORM... to je trochu víc high level přístup, nevím, jestli se o tom teď rozepisovat... Až budeš řešit, že pro dvacet tabulek tam máš vlastně dvacet skoro stejných sad SQL dotazů, že by to místo slovníků mohlo vracet objekty a jak potom volat SQL dotazy nějak automaticky při práci s těmito objekty a jak řešit různé situace s najoinovanými dalšími objekty, tak se na to podívej :) </div>

<div><br></div><div>Máš nějaký konkrétnější dotaz nebo problém, který chceš vyřešit? Není mi úplně jasné, na co se vlastně ptáš. Ještě mě napadá, že asi budeš chtít, aby metoda _sql() vracela funkci. To uděláš takhle pomocí closure funkce:</div>

<div><br></div><div>    def _sql(self, query):</div><div>        def f(**kwargs):<br></div><div>            self._CUR.execute(query, kwargs)</div><div>        return f</div><div><br></div><div>Nebo můžeš místo toho implementovat metodu __getattr__().</div>

<div><br></div><div>Tu metodu del budeš asi muset pojmenovat jinak, protože del je klíčové slovo.</div><div><br></div><div>Jinak takovému hraní fandím. Samozřejmě je to znovuvynalézání kola. Ale je to nejlepší způsob, jak zjistit, jak kolo vlastně funguje :)</div>

<div><br></div><div>PM</div><div class="gmail_extra"><br><div class="gmail_quote">Dne 25. dubna 2014 0:23 Marek Sirový <span dir="ltr"><<a href="mailto:msirovy@gmail.com" target="_blank">msirovy@gmail.com</a>></span> napsal(a):<br>

<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Zdravim,<br>
<br>
behem studia pythonu a hrani si s Flaskem a databazemi obecne me napadla abstrakce nad sql, kterou bych si rad zkusil vytvorit, tusim, ze nejde o nic efektivniho, nebo noveho, ale nejsem programator a python mam jako konicek a toto me zajima ciste ze studijnich duvodu, rad bych vedel, jak se to da vyresit, proto prosim nevymlouvejte mi to, ale poradte  cestu... Nebo ukazte kde mam chybu<br>


<br>
Predstava:<br>
<br>
mam tridu db, ktere dam jako slovnik jmeno metody a sql dotaz, tim se mi vytvori objekt s metodami, kterym bude stacit jen predavat parametry a vrati se mi data z databaze. cili melo by fungovat neco takoveho:<br>
<br>
<br>
#!/usr/bin/env python3<br>
from string import Template<br>
import psycopg2<br>
<br>
<br>
### trida s dynamickymi metodami<br>
class db:<br>
    """ test dynamickych metod<br>
    """<br>
<br>
    def _sql(self, _sql = None, **kwargs):<br>
        """ predloha pro dynamicke funkce<br>
        """<br>
        query = Template(_sql).substitute(**kwargs)<br>
        print(query)<br>
        _self._CUR.execute( query )<br>
        return _self._conn.commit()<br>
<br>
<br>
    def __init__(self, SQL = None):<br>
        if SQL is None:<br>
            raise(KeyError("Musite definovat slovni SQL"))<br>
<br>
        # DB CONNECT<br>
        self._conn = psycopg2.connect("dbname=mail user=marek", cursor_factory= psycopg2.extras.DictCursor)<br>
        self._CUR = self._conn.cursor()<br>
<br>
        # create methods by SQL dict<br>
        for _func, _sql in SQL.items():<br>
            setattr(self, _func, self._sql(_sql = _sql))<br>
<br>
<br>
    def close(self):<br>
        return(True)<br>
<br>
<br>
<br>
if __name__ == '__main__':<br>
    '''Priklad pouziti<br>
    - pridam zaznam pepa<br>
    - smazu zaznam pepa<br>
    '''<br>
    _SQLS = {<br>
            'add' : 'insert into tabulka (name, age, email) VALUES ($name, $age, $email);',<br>
            'edit' : 'update tabulka set age = $age, email = $email where name = $name;',<br>
            'del' : 'remove from tabulka where name = $name;',<br>
            }<br>
<br>
    data = db(_SQLS)<br>
    data.add(name = 'Pepa', age = '12', email = '<a href="mailto:pepa12@gmail.fi">pepa12@gmail.fi</a>')<br>
    data.del(name = 'Pepa')<br>
    data.close()<br>
<br>
Omlouvam se za nedodrzovani PEP, skutecne nejsem moc programator a obcas docela prasim v zapalu boje.<br>
<br>
Predem diky za vysvetleni, pomoc, nasmerovani...<br>
_______________________________________________<br>
Python mailing list<br>
<a href="mailto:python@py.cz">python@py.cz</a><br>
<a href="http://www.py.cz/mailman/listinfo/python" target="_blank">http://www.py.cz/mailman/listinfo/python</a><br>
<br>
Visit: <a href="http://www.py.cz" target="_blank">http://www.py.cz</a><br>
</blockquote></div><br></div></div></div>