轻量级Python数据库抽象层
有人能推荐我一些适合我需求的Python数据库抽象层(DBAL)库吗?我想直接写SQL语句,大部分逻辑会在数据库的存储过程中处理(使用PostgreSQL),所以我只需要调用数据库的存储过程,传递参数给它们,并获取结果。这个库应该能帮助我处理引号问题(防止SQL注入)。我试过使用SQLAlchemy,但我觉得在直接写SQL语句到engine.execute方法时,没有引号处理的帮助。
谢谢!
2 个回答
0
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。
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; --',)]