我有带有主键的表a_table
:
PRIMARY KEY (comp_code, name)
。
我要从名为officer_item_copy
的字典中向其插入数据:
{
'address': 'string',
'name' : 'a non unique name'
'appointed_on': '23/2/1988',
'comp_code': 'OC319508',
'former_names': [
{'forenames': 'string',
'surname': 'string'},
{'forenames': 'string', 'surname': 'string'}
],
}
在列former_names
上,我想存储有关先前名称的信息,该信息是Python中的词典列表,因此我创建了以下限制JSON []
,我想在其中插入某个json数组。
由于this post,我知道如何构造一个插入语句-但这会插入新行,而我想在具有特定主键(名称,代码)的现有行中插入json数组。
我使用this post作为下面代码的参考。
到目前为止,这是我的代码:
# cast dictionaries to json objects
json_array = [json.dumps(i) for i in list_of_dicts_former_names]
insert_data = (json_array, )
# update table "a_table"
cur.execute("""UPDATE company_officers_list
SET
former_names = (%s::json[]),
WHERE
comp_code = {1}
AND
name ={2}""".format(officer_item_copy["comp_code"],
officer_item_copy["name"]),
insert_data)
和我的错误:
---------------------------------------------------------------------------
ProgrammingError Traceback (most recent call last)
<ipython-input-472-af4c715da33d> in <module>
7 name = {}
8 """.format(officer_item_copy["comp_code"], officer_item_copy["name"]),
----> 9 insert_data)
ProgrammingError: syntax error at or near "Name"
LINE 7: name = Unique Name 2
答案 0 :(得分:0)
找到了!
我的代码中出现严重错误,忘记引用WHERE ... AND
语句的值。
cur.execute("""UPDATE company_officers_list
SET
former_names = (%s::json[])
WHERE
comp_code = '{}'
AND
name = '{}'
""".format(officer_item_copy["comp_code"], officer_item_copy["name"]),
insert_data)
考虑到我要插入一个空字段,另一种可能的解决方案可能是使用array_cat
函数。
cur.execute("""UPDATE company_officers_list
SET former_names = array_cat(former_names, (%s::json[]))
WHERE comp_code = '{}'
AND name = '{}';""".format(officer_item_copy["comp_code"],
officer_item_copy["name"]),
insert_data)
此链接帮助我查看了array_cat
函数的示例:
常规更新页面的文档页面帮助我发现了丢失的''