Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy在基于搜索的查询中不区分大小写?_Python_Mysql_Sql_Sqlalchemy_Pyramid - Fatal编程技术网

Python SQLAlchemy在基于搜索的查询中不区分大小写?

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注入攻击的形式访问我。而且我找不到告诉我如

如何以安全的方式在SQLAclhemy ORM中执行不区分大小写的搜索

我和我项目的其他人都在寻找这个,但我们似乎找不到任何适合我们需要的东西

在原始SQL中,我可以做到:

 SELECT * FROM TABLENAME WHERE UPPER(FIELDNAME) IN (UPPER('foo'), UPPER('bar'));
…如果FOO和BAR不是未知情况下的用户输入。事实上,我担心的是:

  • 安全性:我不希望Bobby Tables()以SQL注入攻击的形式访问我。而且我找不到告诉我如何在SQLAlchemy中转义字符串的文档,否则我会觉得连接字符串更安全(但仍然觉得这样做很肮脏)
  • 速度很大程度上是通过索引来处理的,但是很明显,在发出查询之前在RAM中进行大小写更正要比告诉DB进行更正快得多,因此我不会在查询中进行大写的更正,除非我真的必须这样做。然而,以上是展示我想要做什么的最好方式。但是sti;;,它不应该做任何疯狂的事情
  • 平台不可知代码。我将在多个数据库类型上运行它-它将被完全测试,因为我对此有发言权-我不希望查询绑定到SQL的特定对话框。这就是我使用SQLAlchemy的原因
    如果有帮助的话,由于我们使用了其他库,我们目前被绑定到了SQLAlchemy的8.4版本。

    这应该可以准确编译

    query( models.Object )\
    .filter( 
         sqlalchemy.func.upper( models.Object.fieldname )\
         .in_( (sqlalchemy.func.upper(foo) , sqlalchemy.func.upper(bar), ) )
    )\
    .all()
    

  • 您也可以只传入大写文本。就我个人而言,我会在(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)
    索引。

    那么,如果我的输入是字符串列表呢?我的第一篇文章使用了错误的语法。in______________________________。所以你可以抛出一个列表,列表,生成器,lambda/map/等等,将其设置为答案;我的团队和Bobby Table的妈妈都谢谢你,谢谢。我应该补充一点,进行小写比较/存储通常更好地进行调试——它往往比大写更容易被人阅读。是的,但排序规则的问题是它是一个特定于平台的问题,我们正试图尽可能使其与平台无关。