我使用inspect
模块尝试将Python函数的参数列表插入到PostgreSQL DB中。我设法打印了这些参数但没有插入到DB中。我收到此错误:
ERROR: Mixing iteration and read methods would lose data
代码:
import inspect
def func(a, b, c):
frame = inspect.currentframe()
args, _, _, values = inspect.getargvalues(frame)
for i in args:
cu.execute("INSERT INTO tmp VALUES (a,b,c) " + (i, values[i])) #doesn't work
print " %s = %s" % (i, values[i]) #works
cx.commit()
答案 0 :(得分:0)
这句话就是问题所在:
cu.execute("INSERT INTO tmp VALUES (a,b,c) " + (i, values[i])) #doesn't work
在for循环中,您正在执行 args 中的每个 i ,其转换为:
cu.execute("INSERT INTO tmp VALUES (a,b,c) " + ('a', 1))
cu.execute("INSERT INTO tmp VALUES (a,b,c) " + ('b', 2))
cu.execute("INSERT INTO tmp VALUES (a,b,c) " + ('c', 3))
然而你的 VALUES 有3个值(a,b,c)所以它会抛出一个错误,把for循环后的执行语句应该起作用:
args, _, _, values = inspect.getargvalues(frame)
for i in args:
print " %s = %s" % (i, values[i]) #works
cu.execute("INSERT INTO tmp VALUES (%s,%s,%s);", tuple(values[a] for a in args) )
cx.commit()
事实上,你可以简单地在没有 args 的情况下执行(不确定为什么要从检查中提取args而不是直接将它们传递给执行:
cu.execute("INSERT INTO tmp VALUES (%s,%s,%s);", (a, b, c))
...
希望这有帮助。