我正在试图找出以下行的确切内容 - 特别是%%的部分?
cursor.execute('INSERT INTO mastertickets (%s, %s) VALUES (%%s, %%s)'%sourcedest, (self.tkt.id, n))
有关字符串格式化以及使用Python将变量插入字符串的任何好的小型教程吗?
答案 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))))
永远不要那样做。