<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>