python的轻量级DBAL

时间:2011-08-09 19:13:57

标签: python postgresql recommendation-engine dbal

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

谢谢

2 个答案:

答案 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。