更新现有行以插入json数组-Postgresql

时间:2019-04-08 15:24:30

标签: python sql json postgresql psycopg2

我有带有主键的表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

1 个答案:

答案 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函数的示例:

https://makandracards.com/makandra/36097-postgresql-how-to-add-remove-modify-array-values-and-how-to-replace-1-value-with-multiple-values

常规更新页面的文档页面帮助我发现了丢失的''

https://www.postgresql.org/docs/9.1/sql-update.html