如何在SQLAlchemy ORM中进行安全的不区分大小写的IN搜索?
我和我的团队成员都在寻找这个答案,但似乎没有找到符合我们需求的方法。
在原始的SQL中,我可以这样做:
SELECT * FROM TABLENAME WHERE UPPER(FIELDNAME) IN (UPPER('foo'), UPPER('bar'));
如果FOO和BAR不是用户输入的未知情况下,我很担心以下问题:
- 安全性:我不想遭受Bobby Tables(http://xkcd.com/327/)的访问,也找不到告诉我如何在SQLAlchemy中转义字符串的文档,如果我连接字符串会感觉更安全(但仍然感觉不舒服)。
- 速度主要由索引处理,但显然,在发出查询之前在RAM中进行大小写校正比告诉数据库执行更快,因此,除非我真的需要,否则不会在查询中使用UPPER。上面的方法是展示我想做的事情的最佳方式。但它不应该做任何疯狂的事情。
- 平台无关代码。我将在多个数据库类型上运行它,并且只要我有发言权,就会完全测试它,我不希望查询被绑定到特定的SQL对话框上。毕竟,这就是我使用SQLAlchemy的原因。:)
如果有帮助,由于我们使用其他库,我们目前绑定到SQLAlchemy 8.4版本。