2011-08-09 4 views
0

누군가 제 요구 사항에 가장 적합한 파이썬 DBAL 라이브러리를 추천 해 주실 수 있습니다. 내 SQL 문을 직접 작성하고 싶습니다. 논리의 대부분은 db 저장 프로 시저 (postgresql)에있을 것이므로 db 프로 시저를 호출하고 인수를 전달하고 결과를 가져올 필요가 있습니다. 이 라이브러리는 인용 (SQL 주입 방지)을 도와 주어야합니다. sqlalchemy를 사용했지만 SQL 문을 직접 engine.execute 메서드에 쓸 때 인용 도우미가 없다고 생각합니다.파이썬에 대한 가벼운 DBAL

고맙습니다.

+0

가능한 [Python PostgreSQL modules. 어느 쪽이 가장 좋습니까?] (http://stackoverflow.com/questions/144448/python-postgresql-modules-which-is-best) – agf

답변

3

sqlalchemy에 깊은 모양을 지정해야합니다. 자동으로 적절하게 사용하는 경우, SQL 주입을 방지하기 위해 인용합니다

>>> 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 alchemy book ... 나는 그것을 더 깊이보아야한다. 고맙습니다! – JoshuaBoshi

+0

[O'Reilly book] (http://oreilly.com/catalog/9780596516147/)을 의미하는 경우, 이는 sqlalchemy 0.4.0만을 다루고 있습니다. 매우 오래되었습니다. – SingleNegationElimination

0

psycopg2 (DB-API를 통해) : 그것은 인용 자리의 벌금 작업을 수행합니다. (파이썬 방법은 잘못된 것입니다, 당신은 쿼리 명령 자체에 인수로 매개 변수를 전달해야합니다.)

잘못된 :

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에 익숙하고 추상화 레이어가 필요 없다면 데이터에 훨씬 더 가까이 있기 때문에 성능이 훨씬 향상됩니다. –