【问题标题】:Newbie Python question about strings with parameters: "%%s"?关于带参数的字符串的新手 Python 问题:“%%s”?
【发布时间】:2010-09-23 23:03:05
【问题描述】:

我正试图弄清楚以下行的确切作用 - 特别是 %%s 部分?

cursor.execute('INSERT INTO mastertickets (%s, %s) VALUES (%%s, %%s)'%sourcedest, (self.tkt.id, n))

关于字符串格式化和使用 Python 将变量插入字符串的任何好的迷你教程?

【问题讨论】:

  • 那是一段很臭的代码。你是在哪里找到那个东西的。这是我想避免的。
  • trac 的 mastertickets 插件
  • 哦,出于好奇......我同意它不是很可读(因此问题;),但是应该怎么做呢?

标签: python string


【解决方案1】:

%% 变成单个 %

【讨论】:

    【解决方案2】:

    %% 变为单个 %。这段代码本质上是在做两级字符串格式化。首先执行%sourcedest 将您的代码实质上变成:

    cursor.execute('INSERT INTO mastertickets (BLAH, FOO) VALUES (%s, %s)', (self.tkt.id, n))
    

    然后 db 层将参数应用于剩余的槽。

    需要double-% 才能让db 的槽安全地通过第一个字符串格式化操作。

    【讨论】:

      【解决方案3】:

      “但是应该怎么做呢?”

      艰难的决定。问题是他们正在动态地将元数据(特别是列名)插入到 SQL 语句中。我不是这种事情的忠实粉丝。 sourcedest 变量有两个将要更新的列名。

      很有可能只有一对(或几对)实际使用的列名。我的偏好是这样做。

      if situation1:
          stmt= "INSERT INTO mastertickets (this, that) VALUES (?, ?)"
      elif situation2:
          stmt= "INSERT INTO mastertickets (foo, bar) VALUES (?, ?)"
      else:
          raise Exception( "Bad configuration -- with some explanation" )
      cursor.execute( stmt, (self.tkt.id, n) )
      

      当此类事物有多个有效的列组合时,表明数据模型已将两个实体合并到一个表中,这是一个常见的数据库设计问题。由于您使用的是产品和插件,因此您对数据模型问题无能为力。

      【讨论】:

        【解决方案4】:

        使用字符串格式插入列名并不是那么糟糕,只要它们不是用户提供的。这些值应该是查询参数:

        stmt = "INSERT INTO mastertickets (%s, %s) VALUES (?, ?)" % srcdest
        ...
        cursor.execute( stmt, (self.tkt.id, n) )
        

        【讨论】:

          【解决方案5】:

          也一样:

          cursor.execute('INSERT INTO mastertickets (%s, %s) VALUES (:%s, :%s)' % \
              tuple(sourcedest + sourcedest), dict(zip(sourcedest, (self.tkt.id, n))))
          

          永远不要那样做。

          【讨论】:

          • 哦,别担心。我不会。 o_O
          猜你喜欢
          • 1970-01-01
          • 2022-12-03
          • 1970-01-01
          • 2010-09-23
          • 2017-01-21
          • 2014-07-04
          • 2021-07-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多