轻量级DBAL for python

问题描述:

有人可以请我推荐一些最适合我需求的python DBAL库。我想直接编写我的sql语句,大部分逻辑将在db存储过程(postgresql)中,所以我只需要调用db过程,将参数传递给它们并获取结果。图书馆应该帮助我引用(防止sql注入)。 我玩过sqlalchemy,但我认为在将sql语句直接写入engine.execute方法时没有引用助手。轻量级DBAL for python

谢谢

+0

[Python PostgreSQL模块的可能重复。哪个是最好的?](http://stackoverflow.com/questions/144448/python-postgresql-modules-which-is-best) – agf

你应该给予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

psycopg2(通过DB-API)将自动报价,以防止SQL注入,如果你正确地使用它。 (蟒蛇的方法是错误的,你必须传递的参数作为参数传递给查询命令本身。)

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感到满意并且不需要抽象层,那么您将看到更高的性能,因为您距离数据更近。 –