Dne pátek, 25. dubna 2014 1:15:55 UTC+2 Petr Messner napsal(a):
> Ahoj,
> 
> 
> nejzásadnější problém, který tam vidím, je zranitelnost proti SQL injection:
> 
> 
> http://xkcd.com/327/
> 
> 
> 
> Místo celého Template prostě ty parametry předej do execute:
> 
> 
> 
> 
> http://initd.org/psycopg/docs/usage.html#query-parameters
> 
> 
> 
> Doporučuji podívat se na SQLAlchemy (http://docs.sqlalchemy.org/en/latest/). 
> 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 :) 
> 
> 
> 
> 
> 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:
> 
> 
> 
> 
>     def _sql(self, query):
>         def f(**kwargs):
> 
>             self._CUR.execute(query, kwargs)
>         return f
> 
> 
> Nebo můžeš místo toho implementovat metodu __getattr__().
> 
> 
> 
> 
> Tu metodu del budeš asi muset pojmenovat jinak, protože del je klíčové slovo.
> 
> 
> 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 :)
> 
> 
> 
> 
> PM
> 
> 
> Dne 25. dubna 2014 0:23 Marek Sirový <msi...@gmail.com> napsal(a):
> 
> 
> Zdravim,
> 
> 
> 
> 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
> 
> 
> 
> 
> 
> Predstava:
> 
> 
> 
> 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:
> 
> 
> 
> 
> 
> #!/usr/bin/env python3
> 
> from string import Template
> 
> import psycopg2
> 
> 
> 
> 
> 
> ### trida s dynamickymi metodami
> 
> class db:
> 
>     """ test dynamickych metod
> 
>     """
> 
> 
> 
>     def _sql(self, _sql = None, **kwargs):
> 
>         """ predloha pro dynamicke funkce
> 
>         """
> 
>         query = Template(_sql).substitute(**kwargs)
> 
>         print(query)
> 
>         _self._CUR.execute( query )
> 
>         return _self._conn.commit()
> 
> 
> 
> 
> 
>     def __init__(self, SQL = None):
> 
>         if SQL is None:
> 
>             raise(KeyError("Musite definovat slovni SQL"))
> 
> 
> 
>         # DB CONNECT
> 
>         self._conn = psycopg2.connect("dbname=mail user=marek", 
> cursor_factory= psycopg2.extras.DictCursor)
> 
>         self._CUR = self._conn.cursor()
> 
> 
> 
>         # create methods by SQL dict
> 
>         for _func, _sql in SQL.items():
> 
>             setattr(self, _func, self._sql(_sql = _sql))
> 
> 
> 
> 
> 
>     def close(self):
> 
>         return(True)
> 
> 
> 
> 
> 
> 
> 
> if __name__ == '__main__':
> 
>     '''Priklad pouziti
> 
>     - pridam zaznam pepa
> 
>     - smazu zaznam pepa
> 
>     '''
> 
>     _SQLS = {
> 
>             'add' : 'insert into tabulka (name, age, email) VALUES ($name, 
> $age, $email);',
> 
>             'edit' : 'update tabulka set age = $age, email = $email where 
> name = $name;',
> 
>             'del' : 'remove from tabulka where name = $name;',
> 
>             }
> 
> 
> 
>     data = db(_SQLS)
> 
>     data.add(name = 'Pepa', age = '12', email = 'pep...@gmail.fi')
> 
>     data.del(name = 'Pepa')
> 
>     data.close()
> 
> 
> 
> Omlouvam se za nedodrzovani PEP, skutecne nejsem moc programator a obcas 
> docela prasim v zapalu boje.
> 
> 
> 
> Predem diky za vysvetleni, pomoc, nasmerovani...
> 
> _______________________________________________
> 
> Python mailing list
> 
> pyt...@py.cz
> 
> http://www.py.cz/mailman/listinfo/python
> 
> 
> 
> Visit: http://www.py.cz

Ahoj,


diky za reakci, sqlalchemy znam a ORM taky, ale mam radeji ciste sql dotazy. 
Kazdopadne o to nejde.

Pravdepodobne jsem spatne popsal problem, me nejde o to pripojit se k databazi, 
me jde o to vyzkouset si napsat tu abstrakci. 

Uplne konkretne, chci napsat tridu, ktera podle predaneho pole behem 
inicializace si vygeneruje metody dle slovniku. Nedelam to pro nic konkretniho, 
jen me bavi python a zkousim co vsechno jde a tim se ucim dalsi veci




#moje magicka trida
class db:
    # nejaka magie



# mam slovnik:
SQL = {
    'addUser' : 'insert into users (name, email) VALUES ($name, $email);',
    'delUser'  : 'delete from users where name = $name',
}

# provedu si inicializaci
data = db(SQL)

# a ted mam objekt data, ktery ma metodu addUser a delUser, 
# pricemz kazda z nich prebira **kwargs a podle toho doplni dotaz do db.
# priklad:

data.addUser(name = 'karel', email = 'ka...@email.tld')


Toto pouziti je jen priklad, ktery me napadl pro vyzkouseni, SQL injection tam 
samozrejme hrozi, ale o bezpecnost tu nejde, tu bych stejne resil pravdepodobne 
uz na formularich pomoci validace a csrf, pak urcite na db kde z kodu volam 
stejne jedine procedury a pohledy, Ale ted si hraju s dymanickymi metodami a 
chci zkusit generovat je ze slovniku. Kod uplne v prvnim prispevku je pokus, 
ktery nefunguje protoze sem nejpis neco spatne pochopil.

Predem diky

_______________________________________________
Python mailing list
python@py.cz
http://www.py.cz/mailman/listinfo/python

Visit: http://www.py.cz

Odpovedet emailem