【问题标题】:Updating string based on dictionary key value in python where key is partial string根据python中的字典键值更新字符串,其中键是部分字符串
【发布时间】:2021-06-16 10:15:54
【问题描述】:

我有一个字符串,我想用基于特定键的值进行更新。我的挑战是我的字典中的值之一是部分字符串值

parameters = {"$1":"'name'", 
              "$2":"hierarchy LIKE '%|user_name|%'"}

我想用值替换 $1 和 $2 的字符串是:

query = """
  SELECT
    $1 AS org,
   FROM
     table
   WHERE
     input ='Active'
     AND $2
   GROUP BY 1, 2, 3, 4, 5, 6
"""

然后我通过以下代码运行它:

for key in parameters.keys():
    query = query.replace(key, parameters[key])

用 'name' 替换 $1 可以正常工作,但不能正确替换 $2。我们最终得到:

print(query)

输出:

"""
  SELECT
    'name' AS org,
   FROM
     table
   WHERE
     input ='Active'
     AND hierarchy
   GROUP BY 1, 2, 3, 4, 5, 6
"""

问题是在替换 $2 时,它会遗漏完整的字符串。有什么建议吗?

【问题讨论】:

  • 你能稍微改变一下查询并用括号包裹$1吗?
  • 其实,你的循环对我有用????你用的是哪个 Python 版本?
  • 太奇怪了,我使用的是 Python 3。出于某种原因,它正在丢弃值的“LIKE '%|user_name|%'”部分
  • 在 $1 周围加上括号是什么意思?我认为那部分实际上是 WAI
  • 我的意思是你可以写 `SELECT {$1} AS org, FROM table WHERE input ='Active' AND {$2} GROUP BY 1, 2, 3, 4, 5, 6` 然后@ 987654327@。效果更好吗?

标签: python sql string dictionary key


【解决方案1】:

你可以使用re.sub:

import re
print(re.sub('\$\d+', lambda x:parameters[x.group()], query))

输出

SELECT
  'name' AS org,
FROM
  table
WHERE
  input ='Active'
  AND hierarchy LIKE '%|user_name|%'
GROUP BY 1, 2, 3, 4, 5, 6

【讨论】:

    【解决方案2】:
    parameters = {
        "$1": "'name'", 
        "$2": "hierarchy LIKE '%|user_name|%'",
    }
    

    str.replace

    query = """
      SELECT
        $1 AS org,
       FROM
         table
       WHERE
         input ='Active'
         AND $2
       GROUP BY 1, 2, 3, 4, 5, 6
    """
    
    for key, value in parameters.items():
        query = query.replace(key, value)
    

    老办法:str % (params)

    query = """
      SELECT
        %s AS org,
       FROM
         table
       WHERE
         input ='Active'
         AND %s
       GROUP BY 1, 2, 3, 4, 5, 6
    """ % (parameters['$1'], parameters['$2'])
    

    更好:str.format

    query = """
      SELECT
       {$1} AS org,
       FROM
         table
       WHERE
         input ='Active'
         AND {$2}
       GROUP BY 1, 2, 3, 4, 5, 6
    """.format(**parameters)
    

    新方式:f'string'

    query = f"""
      SELECT
       {parameters['$1']} AS org,
       FROM
         table
       WHERE
         input ='Active'
         AND {parameters['$2']}
       GROUP BY 1, 2, 3, 4, 5, 6
    """
    

    提示:使用 SQL 时不要使用裸字符串格式。由于 SQL 注入是众所周知的漏洞,因此请注意这些代码部分。

    提示:检查您的 python 版本是否已过时。 (新的稳定版本:3.9),但不要急于升级它

    【讨论】:

      猜你喜欢
      • 2019-05-01
      • 1970-01-01
      • 2016-08-20
      • 1970-01-01
      • 2021-08-22
      • 1970-01-01
      • 1970-01-01
      • 2013-07-02
      • 1970-01-01
      相关资源
      最近更新 更多