将参数列表函数插入数据库

Insert List of Parameters Function into DB

我使用 inspect 模块试图将 Python 函数的参数列表插入到 PostgreSQL 数据库中。我设法打印了这些参数但没有插入到数据库中。我收到此错误:

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() 

这条语句有问题:

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 而不是将它们直接传递给 execute:

cu.execute("INSERT INTO tmp VALUES (%s,%s,%s);", (a, b, c)) 
...

希望这对您有所帮助。