如何以安全的方式在SQLAclhemy ORM中进行不区分大小写的IN搜索?
我本人和项目中的其他人都在寻找这一点,但是我们似乎找不到任何符合我们需求的东西。
在原始SQL中,我可以这样做:
SELECT * FROM TABLENAME WHERE UPPER(FIELDNAME) IN (UPPER('foo'), UPPER('bar'));
..如果在未知情况下FOO和BAR不是用户输入。实际上,我担心以下问题:
如果有帮助,由于使用其他库,我们目前已绑定到8.4版本的SQLAlchemy。
这应该完全编译...
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)
查询进行查询时使用该索引。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句