轻量级Python数据库抽象层

0 投票
2 回答
929 浏览
提问于 2025-04-16 23:13

有人能推荐我一些适合我需求的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; --',)]

撰写回答