ОБНОВИТЬ существующую строку для вставки массива json - postgresql - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть таблица 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.

Я понимаю, как построить оператор вставки, благодаря этому посту - но это вставляет новую строку, тогда как я хочу вставить массив json в существующий с определенным первичным ключом (имя, код ).

Я использую этот пост в качестве ссылки для моего кода ниже.

Вот мой код:

# 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 голосов
/ 09 апреля 2019

Нашли это!

Глупая ошибка в моем коде, забудьте процитировать значения оператора 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

...