Архив рубрики ‘PostgreSQL’

INSERT OR IGNORE

Положим, что в таблице используется первичный ключ, чтобы избежать дублирования данных. Некоторые БД (например, SQLite) при внесении данных допускаю конструкцию вида
INSERT OR IGNORE INTO tablename ...
и тогда попытки внести данные, нарушающие уникальность первичного ключа, молча игнорируются.

В PostgreSQL, к сожалению такой синтаксис не работает, но добиться требуемого функционала можно с помощью создания специального правила, обрабатывающего операции добавления в таблицу tablename с первичным ключом userkey:

CREATE OR REPLACE RULE "insert_test" AS
  ON INSERT TO "tablename"
  WHERE
    EXISTS(SELECT 1 FROM tablename WHERE userkey=NEW.userkey)
  DO INSTEAD NOTHING

обратный слэш

разбирался сегодня с такой проблемой: скрипт на python-е, в нем строка вида ‘/_\_’ (входные данные вот такие, юзвери прикалываются :) ) и надо ее передать дальше в базу данных на PostgreSQL конструкцией вида, например,
UPDATE XXX SET xID = '/_\_' ...
Чтение документации показало, то БД хочет данные в виде ‘\’ → ‘\\’, то есть обратный слэш надо заэкранировать + указать на это явным образом используя префикс E, т.е. получаем sql-команду вида
UPDATE XXX SET xID = E'/_\\_' ...
теперь переходим к python-у — заэкранировать слеши в строке можно так
x = '/_\_'
y = x.encode('string_escape')
получим требуемый результат
y = '/_\\_'