如果我没有所有值,如何提交INSERT INTO

时间:2019-07-16 14:00:14

标签: python sql postgresql psycopg2

我正在Python中使用Psycopg2,以便将数据插入PostgreSQL摘要表。我要插入的数据是从数百个CSV文件中获取的数据。我知道如何获取所需的数据,并且我已经有执行此操作的代码。问题是,在某些CSV文件中,某些值不存在。

例如: 文件#1:

XBT:1
ABC:2
ABD:3
...
...

文件#2:

ABC:4
ABD:5
...
...

在这种情况下,我正在使用字典,以便稍后将数据插入表中。 所以首先我有一个创建字典的函数。在这种情况下,第一个字典将如下所示:

{'XBT':1,'ABC':2,'ABD':3}

第二个看起来像这样:

{'ABC':4,'ABD':5}

问题将出在INSERT INTO命令上。我有一个将数据插入表中的函数,如下所示:

INSERT INTO 
summary(XBT,ABC,ABD)
VALUES (%s, %s, %s)

当循环尝试遍历第二个文件时,我将得到一个错误,因为字典将没有'XBT'值。 我正在寻找的解决方案是,如果字典缺少值,则INSERT INTO函数仍会向表中添加新行,而该行将没有缺少值。无法为每种情况创建INSERT INTO函数,因为有超过100个变量。

1 个答案:

答案 0 :(得分:1)

简单的解决方案是将字典中的键也转换为%s,并在构建过程中构建字符串并构建相应的数组。然后,您可以组合所有内容并执行该语句。

key_str = ''
val_string = ''
key_arr = []
val_arr = []
for key, value in your_dict.iteritems():
    key_str += "%s,"
    val_str += "%s,"
    key_arr.append(key)
    val_arr.append(value)
# Then do some string manipulation
command = "INSERT INTO summary({keys}) VALUES ({values})".format(keys=key_str[:1], values = val_str[:1])
# and combine your arrays
substitutions = key_arr + val_arr
# Then execute the command
cursor.execute(command, substitutions)
# Continue with whatever you were going for.