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

问题描述 投票:0回答:1

我有这个主键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,我理解如何构造一个insert语句 - 但这会插入一个新行,而我想在一个带有某个主键(名称,代码)的现有数据中插入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
python sql json postgresql psycopg2
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.