关于带参数的字符串的新手Python问题:“%% s”?

时间:2008-11-25 13:43:05

标签: python string

我正在试图找出以下行的确切内容 - 特别是%%的部分?

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

有关字符串格式化以及使用Python将变量插入字符串的任何好的小型教程吗?

5 个答案:

答案 0 :(得分:6)

%%成为一个%。此代码基本上执行两个级别的字符串格式。首先执行%sourcedest将您的代码转换为:

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

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

需要双倍才能使db的插槽安全地通过第一个字符串格式化操作。

答案 1 :(得分:4)

“但是应该怎么做呢?”

艰难的电话。问题是他们正在将元数据(特别是列名称)即时插入到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) )

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:1)

%%变成单个%

答案 4 :(得分:0)

它也是如此:

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

永远不要那样做。