轻量级DBAL for python
有人可以请我推荐一些最适合我需求的python DBAL库。我想直接编写我的sql语句,大部分逻辑将在db存储过程(postgresql)中,所以我只需要调用db过程,将参数传递给它们并获取结果。图书馆应该帮助我引用(防止sql注入)。 我玩过sqlalchemy,但我认为在将sql语句直接写入engine.execute方法时没有引用助手。轻量级DBAL for python
谢谢
你应该给予sqlalchemy更深入的了解;它引用的占位符方面做得很好:
>>> engine = sqlalchemy.create_engine("sqlite:///:memory:")
>>> engine.execute("select ?", 5).fetchall()
[(5,)]
>>> engine.execute("select ?", "; drop table users; --").fetchall()
[(u'; drop table users; --',)]
哦,亲爱的......这就是:-O我从来没有在教程中看到它或sql炼金术书...我真的应该更深入地看看。谢谢! – JoshuaBoshi
如果您的意思是[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。
此外,psycopg2往往会更快(可能快百分之百)。如果您对SQL感到满意并且不需要抽象层,那么您将看到更高的性能,因为您距离数据更近。 –
[Python PostgreSQL模块的可能重复。哪个是最好的?](http://stackoverflow.com/questions/144448/python-postgresql-modules-which-is-best) – agf