将参数列表函数插入数据库
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))
...
希望这对您有所帮助。
我使用 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))
...
希望这对您有所帮助。