2011-08-09 11 views
0

誰かが私の要件に最も適したPython DBALライブラリをお勧めします。私は直接SQLステートメントを書いていますが、ロジックのほとんどはストアドプロシージャ(postgresql)に格納されるので、dbプロシージャを呼び出し、引数を渡して結果を取得する必要があります。ライブラリは引用(SQLインジェクションの防止)に役立ちます。 私はsqlalchemyで遊んだけど、SQL文を直接engine.executeメソッドに書き込むときには、引用ヘルパーがないと思います。Python用軽量DBAL

ありがとうございました

+0

[Python PostgreSQLモジュールの複製が可能です。どちらが最善ですか?](http://stackoverflow.com/questions/144448/python-postgresql-modules-which-is-best) – agf

答えて

3

sqlalchemyの詳細を指定する必要があります。

>>> engine = sqlalchemy.create_engine("sqlite:///:memory:") 
>>> engine.execute("select ?", 5).fetchall() 
[(5,)] 
>>> engine.execute("select ?", "; drop table users; --").fetchall() 
[(u'; drop table users; --',)] 
+0

ああああ...これはそれです:-O私はチュートリアルでそれを見たことがないまたはSQLの錬金術本...私は本当にそれをより深く見えるべきです。ありがとうございました! – JoshuaBoshi

+0

[O'Reillyの本](http://oreilly.com/catalog/9780596516147/)を意味する場合は、sqlalchemy 0.4.0のみが対象です。それは非常に時代遅れです。 – SingleNegationElimination

0

psycopg2(DB-API経由)は、SQLインジェクションを防ぐために自動的に引用します(正しく使用する場合)。 (Pythonのやり方は間違っている、あなたは、クエリコマンド自体の引数としてパラメータを渡す必要があります。)

WRONG:

cur.execute('select * from table where last="%s" and first="%s"' 
    % (last, first)) 

RIGHT:

cur.execute('select * from table where last=%s and first=%s', 
    (last, first)) 

注:あなたは%を使用せず、値の周りに引用符を入れません。

MySQLdbとsqlite3の構文は少し異なります。たとえば、sqliteは%sの代わりに?を使用します。

また、psycopg2の場合は、数字やその他のタイプを扱っていても常に%sを使用します。

+0

また、psycopg2ははるかに高速になる傾向があります(おそらく数百パーセント速くなります)。 SQLに慣れており、抽象化レイヤーを必要としない場合は、データに非常に近いので、パフォーマンスが大幅に向上します。 –