【问题标题】:Python : How to break the python mysql query linePython:如何打破 python mysql 查询行
【发布时间】:2013-07-26 19:48:54
【问题描述】:

目前我拥有的是..

cursor.execute ("insert into incoming set  raw='" + f2 + "',  from_em='"+ a2 +"', to2='" + a1 + "'")

我正在努力使自己易于阅读。

所以我试着把它分成多行。

cursor.execute ("insert into incoming set
raw='" + f2 + "',
from_em='"+ a2 +"',
to2='" + a1 + "'
")

这不起作用。

【问题讨论】:

    标签: python python-2.7 mod-wsgi wsgi mysql-python


    【解决方案1】:

    首先:不要构建这样的 SQL 命令。你会得到SQL injections。相反,使用准备好的语句。说了这么多,继续回答。

    您不能在字符串文字的中间换行(除非您使用反斜杠忽略换行符或者您在三引号字符串中)。相反,像这样打破它:

    cursor.execute("insert into incoming set  raw='" + f2 + "',  from_em='"
                   + a2 +"', to2='" + a1 + "'")
    

    请注意,如果换行符位于不匹配的括号、方括号或大括号的中间,则 Python 不会将换行符视为语句的结尾。这是 PEP 8-preferred 在 Python 中进行续行的方式,而不是使用反斜杠。

    【讨论】:

      【解决方案2】:

      试试这个:

      cursor.execute ("insert into incoming set  raw='" 
      + f2 + 
      "',  from_em='" 
      + a2 + 
      "', to2='" 
      + a1 + "'")
      

      在这种情况下,没有必要使用\ 来分隔行,因为整个表达式都在括号内,但请注意,您不能在到达右引号字符之前拆分行。但公平地说,在这里使用字符串格式会更好——这样会更清楚:

      s = "insert into incoming set raw='{0}', from_em='{1}', to2='{2}'"
      cursor.execute(s.format(f2, a2, a1))
      

      【讨论】:

      • 为什么要加反斜杠?由于括号,它们完全没用。
      • 在这种情况下,{} 中的 索引不是强制性的。我喜欢用 dict d = {'a1':a1,'a2':a2,'f2':f2}; cursor.execute("insert into incoming set raw='{f2}', from_em='{a2}', to2='{a1}'".format(d)) 格式化
      • 原来的答案用反斜杠更好,这是我最终使用的,我目前不使用python的“mysql注入安全方法”进行mysql查询,我更喜欢php风格或常规mysql 风格的 mysql 查询,我在外部处理安全问题。 - 苏美尔科尔恰克
      • @PythonQuestions:你犯了一个可怕的错误。在没有准备好的语句的情况下获得正确的注入安全是非常容易出错的。任何知道自己做得足够好以使其正确的人都知道准备好的语句是更好的选择。
      猜你喜欢
      • 2012-04-26
      • 1970-01-01
      • 1970-01-01
      • 2017-06-20
      • 2018-06-01
      • 1970-01-01
      • 2019-04-03
      • 2022-11-16
      • 2021-02-25
      相关资源
      最近更新 更多