有人可以向我推荐一些最符合我要求的python DBAL库。我想直接编写我的sql语句,大多数逻辑都将在db存储过程(postgresql)中,所以我只需要调用db过程,将参数传递给它们并获取结果。该库应该帮助我引用(防止sql注入)。 我玩sqlalchemy,但我认为在将sql语句直接写入engine.execute方法时没有引用帮助器。
谢谢
答案 0 :(得分: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; --',)]
答案 1 :(得分:0)
psycopg2(通过DB-API)将自动引用以防止SQL注入,如果您正确使用它。 (python方式错误;您必须将参数作为参数传递给查询命令本身。)
<强> WRONG:强>
cur.execute('select * from table where last="%s" and first="%s"'
% (last, first))
从右:强>
cur.execute('select * from table where last=%s and first=%s',
(last, first))
注意:您不使用%,并且不会在您的值周围加上引号。
MySQLdb和sqlite3的语法略有不同。 (例如,sqlite使用?而不是%s。)
此外,对于psycopg2,即使您正在处理数字或其他类型,也要始终使用%s。