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