Postgresq / Python, включите обновление и запросы вставки в один запрос, который вставляется, только если запись не существует - PullRequest
0 голосов
/ 10 января 2019

Я использую следующие два запроса (в PostgreSQL / Python):

query_update = """UPDATE my_table
               SET {}='{}'
               WHERE index={}""".format(*[str(updated_columns), str(updated_values), str(updated_row_indices)])

query_insert = """INSERT INTO my_table ({})
                   VALUES ('{}')""".format(*[str(updated_columns), str(updated_values), str(updated_row_indices)])

Вместо этих двух запросов я хочу, чтобы только один запрос автоматически вставлял запись, если она не завершается. У меня два вопроса:

  1. Как объединить эти два запроса в один запрос с помощью PostgreSQL? (Важно)
  2. Как сделать то же самое, используя MySQL? (По желанию)

Ответы [ 2 ]

0 голосов
/ 10 января 2019

query_update не требуется.

Добавить ON CONFLICT предложение для вас query_insert переменная.

query_insert = """INSERT INTO my_table ({})
                   VALUES ('{}')
ON CONFLICT ({}) DO
UPDATE
   SET {}""".format(*[str(columns_to_insert), str(column_values), str(key_columns)], str(column_values_update))

Здесь, columns_to_insert должен быть разделенным запятыми списком столбцов, в которые вы вставляете данные; column_values ​​ должен быть разделенным запятыми списком значений для columns_to_insert ; key_columns должен быть разделенным запятыми списком столбцов первичного ключа; column_values_update должен быть разделенным запятыми списком column_name = column_value пар (аналогично обычной команде UPDATE).

0 голосов
/ 10 января 2019

Есть нечто, называемое оператором слияния. Это будет делать именно то, что вы ищете

https://www.postgresql.org/message-id/attachment/23520/sql-merge.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...