拥有以下代码:
while True:
line = sys.stdin.readline()
if not line:
break
dbcur.execute("INSERT INTO test(event_type) VALUES ('noline')")
dbcon.commit()
try:
dbcur.execute("INSERT INTO test(event_type) VALUES ('dict')")
dbcon.commit()
mydict = dict(line.split(','))
dbcur.execute("INSERT INTO test(event_type) VALUES ('" + mydict.tostr() + "')")
dbcon.commit()
dbcur.execute("INSERT INTO test(event_type) VALUES ('here')")
dbcon.commit()
except Exception, e:
sys.stderr.write(str(e))
在我的数据库中(sql条目只是为了测试stdin到达的位置,因为我无法从命令行和测试运行) - 我到了" dict",所以我&# 39;猜测我做我要做的事情的方式是不正确的。
答案 0 :(得分:0)
您需要遍历列表并逐个执行INSERT
。
另外,为了帮助减少SQL注入的可能性,您不应该直接将值插入INSERT
,而应使用%s
语法并将绑定列表添加到execute
中。 %s
致电。
或者,您可以一次性使用INSERT
语法%s
一堆值。即确定列表的长度并计算thelist = line.split(',')
bindingStrList = len(thelist) * '%s'
dbcur.execute("INSERT INTO test(event_type) VALUES ({0})".format(', '.join(bindingStrList)), thelist)
的字符串,即:
psycopg2
注意:我上面的代码假设为{{1}},但一般来说这个概念应该适用于与postgres交互的其他库。