Python SQLAlchemy在基于搜索的查询中不区分大小写?
如何以安全的方式在SQLAclhemy ORM中执行不区分大小写的搜索 我和我项目的其他人都在寻找这个,但我们似乎找不到任何适合我们需要的东西 在原始SQL中,我可以做到:Python SQLAlchemy在基于搜索的查询中不区分大小写?,python,mysql,sql,sqlalchemy,pyramid,Python,Mysql,Sql,Sqlalchemy,Pyramid,如何以安全的方式在SQLAclhemy ORM中执行不区分大小写的搜索 我和我项目的其他人都在寻找这个,但我们似乎找不到任何适合我们需要的东西 在原始SQL中,我可以做到: SELECT * FROM TABLENAME WHERE UPPER(FIELDNAME) IN (UPPER('foo'), UPPER('bar')); …如果FOO和BAR不是未知情况下的用户输入。事实上,我担心的是: 安全性:我不希望Bobby Tables()以SQL注入攻击的形式访问我。而且我找不到告诉我如
SELECT * FROM TABLENAME WHERE UPPER(FIELDNAME) IN (UPPER('foo'), UPPER('bar'));
…如果FOO和BAR不是未知情况下的用户输入。事实上,我担心的是:
如果有帮助的话,由于我们使用了其他库,我们目前被绑定到了SQLAlchemy的8.4版本。这应该可以准确编译
query( models.Object )\
.filter(
sqlalchemy.func.upper( models.Object.fieldname )\
.in_( (sqlalchemy.func.upper(foo) , sqlalchemy.func.upper(bar), ) )
)\
.all()
如果你想做一个字符串列表,像这样的东西应该可以
.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)
索引。那么,如果我的输入是字符串列表呢?我的第一篇文章使用了错误的语法。in______________________________。所以你可以抛出一个列表,列表,生成器,lambda/map/等等,将其设置为答案;我的团队和Bobby Table的妈妈都谢谢你,谢谢。我应该补充一点,进行小写比较/存储通常更好地进行调试——它往往比大写更容易被人阅读。是的,但排序规则的问题是它是一个特定于平台的问题,我们正试图尽可能使其与平台无关。