如何以安全的方式在SQLAclhemy ORM中进行不区分大小写的搜索?
我和我的项目中的其他人都在寻找这个,但我们似乎无法找到任何符合我们需求的东西。
在原始SQL中,我可以这样做:
SELECT * FROM TABLENAME WHERE UPPER(FIELDNAME) IN (UPPER('foo'), UPPER('bar'));
..如果FOO和BAR在未知情况下不是用户输入。事实上,我担心以下情况:
如果它有帮助,由于我们使用其他库,我们目前已经绑定到8.4版本的SQLAlchemy。
答案 0 :(得分:9)
这应该准确编译......
query( models.Object )\
.filter(
sqlalchemy.func.upper( models.Object.fieldname )\
.in_( (sqlalchemy.func.upper(foo) , sqlalchemy.func.upper(bar), ) )
)\
.all()
您也可以传入大写文字。就个人而言,我会做in_( foo.uppercase() , bar.uppercase() )
SqlAlchemy与DBAPI一起将绑定参数传递到后端数据存储区。翻译 - 值会自动转义。
如果你想做一个字符串列表,这样的东西应该可以工作
.in_( [ i.upper() for i in inputs ] )
.in_( [ sqlalchemy.func.upper(i) for i in inputs ] )
只是想补充一点,如果你想优化这些选择速度,并且在Postgres或Oracle上,你可以创建一个'功能索引'
CREATE INDEX table_fieldname_lower_idx ON table(lower(fieldname))
查询计划程序(在数据库中)将知道在搜索lower(fieldname)
查询时使用该lower(fieldname)
索引。