【问题标题】:Dynamically passing the column name as well the values in python mysql query动态传递列名以及python mysql查询中的值
【发布时间】:2020-06-01 07:43:30
【问题描述】:

这是下面的代码

pythonlist = ['Name','Mno']
datalist = ["qwerty",'234']
sql = "SELECT " + ",".join(pythonlist) + " FROM data WHERE name = '"+ "','".join(datalist) + "' INTO OUTFILE filename"
print(sql)

输出:

SELECT Name,Mno FROM data WHERE Name= 'qwerty','234' 

期望的输出:

SELECT Name,Mno FROM data WHERE Name = 'qwerty' and Mno = 234 

请注意删除 'mno' 中的引号。

我这样做的原因是因为列名以及与之对应的值会经常更改

【问题讨论】:

  • 使它成为字典而不是 list ,就像这样 - {'Name': 'qwerty' , 'Mno' : '234'} 。使用列表进行此类操作看起来不太好。
  • @SowjanyaRBhat 你能把代码发给我吗

标签: python mysql flask


【解决方案1】:

代码:

queryparams = {'Name': 'qwerty', 'Mno': '234'}

and_clause = []
[and_clause.append(' %s = %s ') for k,v in queryparams.items()]
and_clause_str = ' and '.join(and_clause)

sql = 'SELECT %s FROM data WHERE ' + and_clause_str

params = [','.join(queryparams.keys())]
for k,v in queryparams.items():
  params.append(str(k))
  params.append(str(v))
print(sql)
print(params)
cursor.execute(sql, params=tuple(params))

如果您向 dictionary 添加 10/20 以上的项目,则此方法有效。 以及防止 SQL-injection :使用 params 而不是 string-concatenation 传递值。

【讨论】:

  • 如果您不了解,请浏览SQL-injection 主题。您在问题中显示的代码容易受到这些攻击。
【解决方案2】:

试试这个:

data = {'Name': 'qwerty' , 'Mno' : '234'}

sql = "SELECT " + ", ".join(data.keys()) + " FROM data WHERE " + str(list(data.keys())[0]) + "  = '" + \
      str(data[list(data.keys())[0]]) + "' and " +\
      str(list(data.keys())[1]) + " = " + str(data[list(data.keys())[1]])

print(sql)

【讨论】:

  • 欣赏它,但如果我通过增加一个值来增加字典,那么我也必须增加数据列表,这在我的场景中不需要
  • 欣赏它,但是如果我在字典中添加另一个值,例如 'Data': 'JSON',这个 sn-p 将不起作用传递的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-04
  • 2018-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多