将参数功能列表插入DB

时间:2015-01-02 12:55:53

标签: python postgresql

我使用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() 

1 个答案:

答案 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)) 
...

希望这有帮助。