有人可以向我推荐一些最适合我要求的python DBAL库。我想直接写我的 sql 语句,大部分逻辑都在 db 存储过程(postgresql)中,所以我只需要调用 db 过程,将参数传递给它们并获取结果。该库应该帮助我引用(防止 sql 注入)。我玩过 sqlalchemy,但我认为直接将 sql 语句写入 engine.execute 方法时没有引用助手。
谢谢
有人可以向我推荐一些最适合我要求的python DBAL库。我想直接写我的 sql 语句,大部分逻辑都在 db 存储过程(postgresql)中,所以我只需要调用 db 过程,将参数传递给它们并获取结果。该库应该帮助我引用(防止 sql 注入)。我玩过 sqlalchemy,但我认为直接将 sql 语句写入 engine.execute 方法时没有引用助手。
谢谢
您应该对 sqlalchemy 进行更深入的了解;它在引用占位符方面做得很好:
>>> engine = sqlalchemy.create_engine("sqlite:///:memory:")
>>> engine.execute("select ?", 5).fetchall()
[(5,)]
>>> engine.execute("select ?", "; drop table users; --").fetchall()
[(u'; drop table users; --',)]
如果您正确使用 psycopg2(通过 DB-API),它将自动引用以防止 SQL 注入。(python 方式是错误的;您必须将参数作为参数传递给查询命令本身。)
错误的:
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。