Как использовать функцию postgresql «insert… on conflict» (upsert) с flask_sqlalchemy?

Удаление текущей PostgreSQL 9.6.8

Смотрим что установлено:

$ dpkg -l | grep postgres
ii postgresql-client-pro-1c-9.6 9.6.8-1.1C.stretch amd64 front-end programs for PostgreSQL 9.6
ii postgresql-common-pro-1c 181-7.stretch all PostgreSQL database-cluster manager
ii postgresql-contrib-pro-1c-9.6 9.6.8-1.1C.stretch amd64 additional facilities for PostgreSQL
ii postgresql-pro-1c-9.6 9.6.8-1.1C.stretch amd64 object-relational SQL database, version 9.6 server

1
2
3
4
5

$dpkg-l|grep postgres

ii postgresql-client-pro-1c-9.69.6.8-1.1C.stretchamd64 front-endprograms forPostgreSQL9.6

ii postgresql-common-pro-1c181-7.stretchall PostgreSQL database-cluster manager

ii postgresql-contrib-pro-1c-9.69.6.8-1.1C.stretchamd64 additional facilities forPostgreSQL

ii postgresql-pro-1c-9.69.6.8-1.1C.stretchamd64 object-relational SQL database,version9.6server

Сохраняем конфиги для дальнейшего переноса настроек в новую версию (если в них что-то меняли, конечно):

$ cp -a /etc/postgresql/10/main/postgresql.conf /home/USER
$ cp -a /etc/postgresql/10/main/pg_hba.conf /home/USER

1
2

$cp-aetcpostgresql10mainpostgresql.confhomeUSER

$cp-aetcpostgresql10mainpg_hba.conf homeUSER

Удаление старых пакетов версии 181. Можно снести
postgresql-common, который потащит за собой все остальные:

$ apt purge postgresql-common

1 $apt purge postgresql-common

Удаляем с помощью
purge , чтобы полностью снести конфиги текущей версии PostgreSQL, иначе при установки новой версии будут ошибки типа:

В целом вот что снеслось:

Изменение таблиц

Последнее обновление: 19.03.2018

Нередко возникает изменить уже имеющуюся таблицу, в частности, добавить или удалить столбцы, изменить тип столбцов и т.д..
То есть потребуется изменить определение таблицы. Для этого применяется выражение ALTER TABLE,
которое имеет следующий формальный синтаксис:

ALTER TABLE название_таблицы
{ ADD название_столбца тип_данных_столбца  | 
  DROP COLUMN название_столбца |
  ALTER COLUMN название_столбца параметры_столбца |
  ADD  определение_ограничения |
  DROP  имя_ограничения}

Рассмотрим некоторые возможности по изменению таблицы.

Добавление нового столбца

Добавим в таблицу Customers новый столбец Phone:

ALTER TABLE Customers
ADD Phone CHARACTER VARYING(20) NULL;

Здесь столбец Phone имеет тип , и для него определен атрибут , то есть
столбец допускает отсутствие значения. Но что если нам надо добавить столбец, который не должен принимать значения NULL? Если в таблице есть
данные, то следующая команда не будет выполнена:

ALTER TABLE Customers
ADD Address CHARACTER VARYING(30) NOT NULL;

Поэтому в данном случае решение состоит в установке значения по умолчанию через атрибут :

ALTER TABLE Customers
ADD Address CHARACTER VARYING(30) NOT NULL DEFAULT 'Неизвестно';

Удалим столбец Address из таблицы Customers:

ALTER TABLE Customers
DROP COLUMN Address;

Изменение типа столбца

Для изменения типа применяется ключевое слово TYPE. Изменим в таблице Customers тип данных у столбца FirstName на (он же ):

ALTER TABLE Customers
ALTER COLUMN FirstName TYPE VARCHAR(50);

Изменение ограничений столбца

Для добавления ограничения применяется оператор SET, после которого указывается ограничение.
Например, установим для столбца FirstName ограничение :

ALTER TABLE Customers 
ALTER COLUMN FirstName 
SET NOT NULL;

Для удаления ограничения применяется оператор DROP, после которого указывается ограничение.
Например, удалим выше установленное ограничение:

ALTER TABLE Customers 
ALTER COLUMN FirstName 
DROP NOT NULL;

Изменение ограничений таблицы

Добавление ограничения CHECK:

ALTER TABLE Customers
ADD CHECK (Age > 0);

Добавление первичного ключа :

ALTER TABLE Customers 
ADD PRIMARY KEY (Id);

В данном случае предполагается, что в таблице уже есть столбец Id, который не имеет ограничения PRIMARY KEY. А с помощью вышеуказанного скрипта устанавливается ограничение PRIMARY KEY.

ALTER TABLE Customers
ADD UNIQUE (Email);

При добавлении ограничения каждому из них дается определенное имя. Например, выше добавленное ограничение для CHECK будет называться
. Имена ограничений можно посмотреть в таблице через pgAdmin.

Также мы можем явным образом назначить ограничению при добавлении имя с помощью оператора CONSTRAINT.

ALTER TABLE Customers
ADD CONSTRAINT phone_unique UNIQUE (Phone);

В данном случае ограничение будет называться «phone_unique».

Чтобы удалить ограничение, надо знать его имя, которое указывается после выражения . Например, удалим выше добавленное ограничение:

ALTER TABLE Customers
DROP CONSTRAINT phone_unique;

Переименование столбца и таблицы

Переименуем столбец Address в City:

ALTER TABLE Customers
RENAME COLUMN Address TO City;

Переименуем таблицу Customers в Users:

ALTER TABLE Customers
RENAME TO Users;

НазадВперед

Подготовка к установке PostgreSQL 10.9 от 1С

В особенностях релиза написано:

Поддержка версии 10.9.5.1 реализована в версии 1С:Предприятии 8.3.14 и старше.
Cписок поддерживаемых дистрибутивов Linux:
DEB, Ubuntu 16.04, должны быть установлены:

Дополнительные модули:

В архиве postgresql-10.9-5.1C_amd64_deb лежат уже собранные пакеты:

  • libpq5_10.9-5.1C_amd64.deb
  • postgresql-10_10.9-5.1C_amd64.deb
  • postgresql-client-10_10.9-5.1C_amd64.deb

В архиве postgresql-10.9-5.1C_amd64_addon_deb лежат доп.модули (мне не понадобились):

  • libecpg6_10.9-5.1C_amd64.deb
  • libecpg-compat3_10.9-5.1C_amd64.deb
  • libecpg-dev_10.9-5.1C_amd64.deb
  • libpgtypes3_10.9-5.1C_amd64.deb
  • libpq-dev_10.9-5.1C_amd64.deb
  • postgresql-10-dbg_10.9-5.1C_amd64.deb
  • postgresql-doc-10_10.9-5.1C_all.deb
  • postgresql-plperl-10_10.9-5.1C_amd64.deb
  • postgresql-plpython-10_10.9-5.1C_amd64.deb
  • postgresql-plpython3-10_10.9-5.1C_amd64.deb
  • postgresql-pltcl-10_10.9-5.1C_amd64.deb
  • postgresql-server-dev-10_10.9-5.1C_amd64.deb

В архиве Patch_SUBD_PostgreSQL_10.9-5.1C лежат файлы для ручной сборки пропатченой postgresql (“голая” версия postgresql и патчи для нее):

  • файлы .patch
  • postgresql-10_10.9-5.1C.debian.tar.xz
  • postgresql-10_10.9-5.1C.dsc
  • postgresql-10_10.9-5.1C_source.changes
  • postgresql-10_10.9.orig.tar.bz2

Создание резервной копии данных

По советам postgresPro:

Для создания копии рекомендуется применять программы pg_dump и pg_dumpall от новой версии Postgres Pro, чтобы воспользоваться улучшенными функциями, которые могли в них появиться. Хотя этот совет может показаться абсурдным, ведь новая версия ещё не установлена, ему стоит последовать, если вы планируете установить новую версию рядом со старой. В этом случае вы сможете выполнить установку как обычно, а перенести данные позже. Это также сократит время обновления.

Я создавал бэкап старой версией PostgreSQL, а потом устанавливал новую.

$ su postgres
$ pg_dumpall > backup_postgresql_9.6.sql

1
2

$su postgres

$pg_dumpall>backup_postgresql_9.6.sql

Сервер 1С:Предприятие на Ubuntu 16.04 и PostgreSQL 9.6, для тех, кто хочет узнать его вкус. Рецепт от Капитана

Если кратко описать мое отношение к Postgres: Использовал до того, как это стало мейнстримом.
Конкретнее: Собирал на нем сервера для компаний среднего размера (до 50 активных пользователей 1С).
На настоящий момент их набирается уже больше, чем пальцев рук пары человек (нормальных, а не фрезеровщиков).
Следуя этой статье вы сможете себе собрать такой же и начать спокойную легальную жизнь, максимально легко сделать первый шаг в мир Linux и Postgres.
А я побороться за 1. Лучший бизнес-кейс (лучший опыт автоматизации предприятия на базе PostgreSQL).
Если, конечно, статья придется вам по вкусу.

Обновление PostgreSQL

Для перехода PostgreSQL с версии 9 на версию 10 недостаточно установить новые пакеты и подсунуть имеющийся каталог данных кластера.

Отсюда:

При обновлении основных версий Postgres Pro внутренний формат данных может меняться, что усложняет процедуру обновления. Традиционный способ переноса данных в новую основную версию — выгрузить данные из старой версии, а затем загрузить их в новую (это не самый быстрый вариант). Выполнить обновление быстрее позволяет pg_upgrade. Также для обновления можно использовать репликацию.

В связи с тем, что у PostgresPro изменились правила лицензирования, и для свободного использования доступна  лишь версия Postgres Pro Standard “для тестирования, разработки ПО, ознакомления с функциональностью СУБД,  использования в образовательном процессе”, и для коммерческих целей ее использовать низя.

Поэтому планируется устанавливать уже готовые “пропатченные” пакеты, собранные самим 1С, и использовать pg_upgrade не будем.

Один из вариантов обновления заключается в выгрузке данных из одной основной версии Postgres Pro и загрузке их в другую — для этого необходимо использовать средство логического копирования, например
pg_dumpall; копирование на уровне файловой системы не подходит. В самом сервере есть проверки, которые не дадут использовать каталог данных от несовместимой версии Postgres Pro, так что если попытаться запустить с существующим каталогом данных неправильную версию сервера, никакого вреда не будет.

Если попытаться запустить новый PostgreSQL со старым каталогом данных, будет вот такая ошибка:

Типы данных и приведение

Существующая таблица в качестве шаблона для типов данных …

Явное приведение типов для первой строки данных в автономном выражении может быть неудобным. Есть способы обойти это. Вы можете использовать любое существующее отношение (таблица, представление, …) в качестве шаблона строки. Целевая таблица является очевидным выбором для варианта использования. Входные данные автоматически приводятся к соответствующим типам, как в предложении для :

Это не работает для некоторых типов данных (объяснение в связанном ответе внизу). Следующий трюк работает для всех типов данных:

… и имена

Если вы вставляете целые строки (все столбцы таблицы — или хотя бы набор ведущих столбцов), вы также можете опустить имена столбцов. Предполагая, что таблица в примере содержит только 3 столбца:

Подробное объяснение и другие альтернативы:

приведение типа NULL при обновлении нескольких строк

В сторону: не используйте зарезервированные слова, такие как в качестве идентификатора. Это заряженный пулемет. Используйте допустимые, строчные, без кавычек идентификаторы. Я заменил его на .

5 ответов

Лучший ответ

Я использовал 3 стратегии для пакетной транзакционной работы:

  1. Создавайте операторы SQL «на лету», объединяйте их точками с запятой, а затем отправляйте операторы за один раз. Я сделал до 100 вставок таким образом, и это было довольно эффективно (сделано против Postgres).
  2. JDBC имеет встроенные возможности пакетной обработки, если они настроены. Если вы генерируете транзакции, вы можете сбрасывать операторы JDBC, чтобы они выполнялись за один раз. Эта тактика требует меньшего количества обращений к базе данных, поскольку все операторы выполняются в одном пакете.
  3. Hibernate также поддерживает пакетную обработку JDBC, как в предыдущем примере, но в этом случае вы выполняете метод для Hibernate , а не для базового соединения JDBC. Он выполняет то же самое, что и пакетная обработка JDBC.

Кстати, Hibernate также поддерживает пакетную стратегию при получении коллекции. Если вы аннотируете коллекцию с помощью , при выборке ассоциаций Hibernate будет использовать вместо , что приведет к меньшему количеству операторов для загрузки коллекций.

19

atrain
11 Авг 2011 в 02:35

Объемные вставки могут быть выполнены как таковые:

Вставим 3 ряда.

Множественное обновление определяется стандартом SQL, но не реализовано в PostgreSQL.

Quote :

Ссылка: http://www.postgresql.org/docs/9.0/static /sql-update.html

13

Ketema
11 Авг 2011 в 16:29

Массовая вставка

Вы можете изменить массовую вставку трех столбцов с помощью Ketema:

Это становится:

Замена значений заполнителями:

Вы должны передать массивы или списки в качестве аргументов этого запроса. Это означает, что вы можете выполнять огромные объемные вставки, не выполняя конкатенации строк (и всех ее проблем и опасностей: внедрение sql и адское цитирование).

Массовое обновление

PostgreSQL добавил в UPDATE расширение FROM. Вы можете использовать это так:

В руководстве отсутствует хорошее объяснение, но есть пример на список рассылки postgresql-admin. Я попытался уточнить это:

Также есть другие сообщения на StackExchange, объясняя с помощью предложения вместо подзапроса. Их может быть легче читать, но они ограничены фиксированным количеством строк.

88

Community
23 Май 2017 в 12:34

1

aliasmrchips
11 Авг 2011 в 03:10

Довольно быстро заполнить json в набор записей (postgresql 9.3+)

10

nogus
7 Дек 2016 в 16:24

Разница между синтаксисом postgresql и mysql

http-equiv=»Content-Type» content=»text/html;charset=UTF-8″>yle=»margin-bottom:5px;»>Теги:  база данных

mysql изменяет данные, когда они существуют, и наоборот, оператор SQL для добавления данных:

В postgresql:

Начиная с версии 9.5 в PostgreSQL естьUPSERTГрамматика сПункт.Используйте следующий синтаксис (похожий на MySQL)

Интеллектуальная рекомендация

1. Для реальных сигналов (для понимания): A (ω) является соотношением амплитуды выходного сигнала и амплитуды входного сигнала, называемого частотой амплитуды. Φ (ω) — это разница межд…

Один. вести Многие люди задавали некоторые вопросы о создании проекта Flex + LCDS (FDS) в сообщениях и группах. Из-за операции ее трудно четко объяснить, поэтому я написал простой учебник (я обещал эт…

package com.example.phonehttp; import android.os.Bundle; import android.os.Handler; import android.app.Activity; import android.widget.ScrollView; import android.widget.TextView; public class MainActi…

Он предназначен для реализации подкласса того же родительского класса с родительским классом. Полиморфизм Один и тот же ссылочный тип использует разные экземпляры для выполнения разных операций; Идея …

тема: Объедините два упорядоченных слоя в новый заказанный список и возврат. Новый список состоит из всех узлов двух связанных списков, данных сплавным. Пример: Анализ: два связанных списка состоит в …

Вам также может понравиться

D. Самая ценная строка Пример ввода 2 2 aa aaa 2 b c Образец вывода aaa c На самом деле, будучи задетым этим вопросом, вы должны быть осторожны. После инвертирования строки, если две строки имеют один…

Given a 2D integer matrix M representing the gray scale of an image, you need to design a smoother to make the gray scale of each cell becomes the average gray scale (rounding down) of all the 8 surro…

calc () может быть очень незнакомым для всех, и трудно поверить, что calc () является частью CSS. Поскольку он выглядит как функция, почему он появляется в CSS, поскольку это функция? Этот момент такж…

Основываясь на дереве регрессии, сформированном CART, а также на предварительной и последующей обрезке дерева, код выглядит следующим образом:…

Откат Обновление в режиме онлайн с версии Centos (CentOS Linux версии 7.3.1611 (Core) до CentOS Linux версии 7.5.1804 (Core)) # ошибка соединения yum-ssh после обновления yexpected key exchange group …

9,4 и старше:

PostgreSQL не имеет встроенной функции (или ), и сделать это эффективно при одновременном использовании очень сложно. 

В общем, вы должны выбрать один из двух вариантов:

  • Отдельные операции вставки/обновления в цикле повтора; или же
  • Блокировка таблицы и выполнение пакетного слияния

Индивидуальная петля повторения ряда

Использование отдельных загрузчиков строк в цикле повтора является разумным вариантом, если вы хотите, чтобы много соединений одновременно пытались выполнить вставки. 

. Это защищает от потерянных обновлений и вставки рас, в отличие от большинства наивных решений. Он будет работать только в режиме и безопасен только в том случае, если это единственное, что вы делаете в транзакции. Функция не будет работать правильно, если триггеры или вторичные уникальные ключи вызывают уникальные нарушения.

Эта стратегия очень неэффективна. Когда это возможно, вы должны поставить работу в очередь и выполнить массовую загрузку, как описано ниже.

Многие попытки решить эту проблему не учитывают откатов, поэтому они приводят к неполным обновлениям. Две транзакции мчатся друг с другом; один из них успешно s; другой получает ошибку дублированного ключа и вместо этого выполняет . блокирует ожидание отката или фиксации . Когда он откатывается, повторная проверка условия соответствует нулю строк, поэтому, хотя фиксирует это, он фактически не выполнил ожидаемую вами защиту. Вы должны проверить количество строк результата и при необходимости повторить попытку.

Некоторые попытки решения также не учитывают гонки SELECT. Если вы попробуете очевидное и простое:

затем, когда два запускаются одновременно, есть несколько режимов отказа. Одним из них является уже обсуждаемая проблема с перепроверкой обновлений. Другой случай, когда оба одновременно, совпадают с нулевыми строками и продолжаются. Затем они оба выполняют тест , который происходит перед параметром . Оба получают ноль строк, поэтому оба делают . Один не удается с ошибкой дубликата ключа.

Вот почему вам нужен повторный цикл. Вы можете подумать, что вы можете предотвратить повторяющиеся ошибки ключа или потерянные обновления с помощью умного SQL, но вы не можете. Вам необходимо проверить количество строк или обработать дубликаты ошибок ключа (в зависимости от выбранного подхода) и повторить попытку.

Пожалуйста, не катите свое собственное решение для этого. Как и в случае с очередями сообщений, это, вероятно, неправильно.

Массовый уперт с замком

Иногда вы хотите выполнить массовое обновление, где у вас есть новый набор данных, который вы хотите объединить в более старый существующий набор данных. Это значительно более эффективно, чем использование отдельных строк, и его следует использовать всегда, когда это целесообразно.

В этом случае вы обычно выполняете следующий процесс:

  • таблица a

  • или массовая вставка новых данных во временную таблицу

  • целевая таблица . Это разрешает другие транзакции для , но не вносит никаких изменений в таблицу.

  • Сделайте существующих записей, используя значения в временной таблице; 

  • Сделайте строк, которые еще не существуют в целевой таблице;

  • , снятие блокировки.

Например, для примера, приведенного в вопросе, используйте многозначное для заполнения временной таблицы:

Ректальное администрирование: Основы для практикующих системных АДминистраторов

Одной из самых популярных и зарекомендовавших себя методологий системного администрирования является так называемое ректальное. Редкий случай сопровождения и обслуживания информационных систем, инфраструктуры организации обходится без его использования. Зачастую без знания данной методологии сисадминам даже бывает сложно найти работу в сфере ИТ, потому что работодатели, особенно всякие аутсорсинговые ИТ фирмы, в основном отдают предпочтение классическим, зарекомендовавшим себя методикам, а не новомодным заграничным веяниям: практикам ITIL, нормальным ITSM и прочей ерунде.

2 ответа

Лучший ответ

Просто нестандартная, нестандартная идея. И col1, и col2 должны быть равны нулю, чтобы исключить использование индекса, возможно, создание псевдоиндекса может быть вариантом. Этот индекс, конечно, будет обычной таблицей, но будет существовать только в течение короткого периода. Кроме того, это избавляет от проблем со временем блокировки.

Выше создается наш «индекс», который содержит только подходящие строки. Теперь оберните оператор update / delete в функцию SQL. Эта функция обновляет основную таблицу и удаляет обновленные строки из «индекса» и возвращает количество оставшихся строк.

Когда функция возвращает 0, все изначально выбранные строки были обработаны. На этом этапе повторите весь процесс, чтобы забрать все добавленные или обновленные строки, которые не были определены при первоначальном выборе. Должно быть небольшое количество, а процесс еще доступен, нужно позже. Как я уже сказал, просто нестандартная идея.

Edited Должно быть, прочитал в нем то, чего не было в отношении col1. Однако идея остается прежней, просто измените оператор INSERT для «indexer», чтобы он соответствовал вашим требованиям. Что касается его установки в «index», то «index» содержит один столбец — первичный ключ большой таблицы (и самой себя). Да, вам нужно будет запускаться несколько раз, если вы не укажете общее число строк для обработки в качестве параметра. Ниже приведен блок DO, который удовлетворит ваше состояние. Он обрабатывает 200 000 на каждом проходе. Измените это, чтобы соответствовать вашим потребностям.

Belayer
12 Дек 2019 в 15:14

Без блокировки нет обновления, но вы можете стремиться к тому, чтобы блокировка строк была короткой и короткой.

Вы можете просто запустить партии этого:

Просто продолжайте повторять этот оператор, пока он не изменит менее 10000 строк, и все готово.

Обратите внимание, что массовые обновления не блокируют таблицу, но, конечно, они блокируют обновленные строки, и чем больше из них вы обновляете, тем дольше транзакция и тем больше риск взаимоблокировки. Чтобы сделать эту производительность, такой индекс поможет:

Чтобы сделать эту производительность, такой индекс поможет:

Laurenz Albe
11 Дек 2019 в 16:21

С одновременной загрузкой записи

Предполагается, что по умолчанию используется . Связанный:

Параллельные транзакции приводят к состоянию гонки с уникальным ограничением на вставку

Лучшая стратегия защиты от состояний гонки зависит от точных требований, количества и размера строк в таблице и в UPSERT, количества одновременных транзакций, вероятности конфликтов, доступных ресурсов и других факторов …

Проблема параллелизма 1

Если параллельная транзакция записала в строку, которую ваша транзакция теперь пытается выполнить UPSERT, ваша транзакция должна дождаться завершения другой.

Если другая транзакция завершается (или какой-либо ошибкой, т. Е. Автоматически ), ваша транзакция может продолжаться как обычно. Незначительный побочный эффект: пропуски в порядковых номерах. Но никаких недостающих строк.

Если другая транзакция завершается нормально (неявно или явно ), ваш обнаружит конфликт (индекс / ограничение является абсолютным) и , следовательно, также не вернуть строку. (Также невозможно заблокировать строку, как показано в проблеме параллелизма 2 ниже, поскольку она не отображается .) видит тот же снимок с начала запроса а также не может вернуть еще невидимую строку.

В результирующем наборе отсутствуют такие строки (даже если они существуют в базовой таблице)!

Это может быть нормально . Особенно, если вы не возвращаете строки, как в примере, и довольны тем, что строка есть. Если этого недостаточно, есть разные способы обойти это.

Вы можете проверить количество строк на выходе и повторить инструкцию, если она не соответствует количеству строк на входе. Может быть достаточно для редкого случая. Дело в том, чтобы запустить новый запрос (может быть в той же транзакции), который затем увидит новые зафиксированные строки.

Или проверьте отсутствующие строки результатов в том же запросе и перезапишите строки с помощью трюка грубой силы, продемонстрированного в Ответ Алексстони.

Это похоже на запрос выше, но мы добавляем еще один шаг с CTE , прежде чем вернем набор результатов. Последний CTE большую часть времени ничего не делает. Только если в возвращаемом результате пропадают строки, мы используем грубую силу.

Еще больше накладных расходов. Чем больше конфликтов с уже существующими строками, тем больше вероятность того, что это превзойдет простой подход.

Один побочный эффект: второй UPSERT записывает строки не по порядку, поэтому он повторно вводит возможность тупиковых ситуаций (см. Ниже), если три или более транзакций, записывающих в одни и те же строки, перекрываются. Если это проблема, вам нужно другое решение — например, повторить все утверждение, как упомянуто выше.

Проблема параллелизма 2

Если параллельные транзакции могут выполнять запись в задействованные столбцы затронутых строк, и вы должны убедиться, что найденные вами строки все еще присутствуют на более позднем этапе той же транзакции, вы можете дешево заблокировать существующие строки в CTE. (которые иначе были бы разблокированы) с помощью:

И добавьте условие блокировки .

Это заставляет конкурирующие операции записи ждать окончания транзакции, когда все блокировки будут сняты. Так что будьте кратки.

Более подробная информация и объяснение:

  • SELECT или INSERT в функции склонны к условиям гонки?

Тупики?

Защититесь от взаимоблокировок , вставляя строки в последовательном порядке . Увидеть:

Тупик с многострочными вставками, несмотря на ON CONFLICT DO NOTHING

Поддержка SQLAlchemy для Postgres> = 9.5

Поскольку большой пост, описанный выше, охватывает множество различных подходов SQL для версий Postgres (не только не-9.5, как в вопросе), я хотел бы добавить, как это сделать в SQLAlchemy, если вы используете Postgres 9.5. Вместо того, чтобы реализовывать свой собственный эффект, вы также можете использовать функции SQLAlchemy (которые были добавлены в SQLAlchemy 1.1). Лично я бы порекомендовал использовать их, если это возможно. Не только из-за удобства, но и потому, что он позволяет PostgreSQL обрабатывать любые условия гонки, которые могут возникнуть.

Перекрестная публикация из другого ответа, который я дал вчера ( https://stackoverflow.com/a/44395983/2156909 )

SQLAlchemy теперь поддерживает с двумя методами и :

Копирование из документации:

Без одновременной нагрузки записи

Столбец является необязательным дополнением, чтобы продемонстрировать, как это работает. На самом деле он может вам понадобиться, чтобы отличить оба случая (еще одно преимущество перед пустой записью).

Последний работает, потому что недавно вставленные строки из прикрепленного CTE, изменяющего данные пока не отображаются в базовой таблице. (Все части одного и того же оператора SQL видят одни и те же снимки базовых таблиц.)

Поскольку выражение является автономным (не прикрепленным напрямую к ), Postgres не может наследовать типы данных из целевых столбцов, и вам, возможно, придется добавить явное приведение типов. Руководство:

Сам запрос (не считая побочных эффектов) может быть немного дороже из-за нескольких дубликатов из-за накладных расходов на CTE и дополнительных (которые должны быть дешевыми, поскольку идеальный index существует по определению — уникальное ограничение реализуется с помощью индекса).

Может быть (намного) быстрее для многих дубликатов. Эффективная стоимость дополнительных операций записи зависит от многих факторов.

Но в любом случае есть меньше побочных эффектов и скрытых затрат . Скорее всего, в целом дешевле.

Присоединенные последовательности по-прежнему являются расширенными, поскольку значения по умолчанию заполняются перед тестированием на конфликты.

О CTE:

  • Дедупликация операторов SELECT в реляционном делении
Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: