Как включить специфичный для PostgreSQL код в переносимый SQL? - PullRequest
3 голосов
/ 01 августа 2011

В MySQL можно включать специфичные для MySQL SQL-операторы в общий / стандартный SQL, используя специальный синтаксис комментариев, такой как:

INSERT /*! DELAYED */ INTO foo VALUES (1, 2, 3);

Это описано в http://dev.mysql.com/doc/refman/5.1/en/comments.html.

Существует ли какой-либо эквивалентный синтаксис или хак, который можно использовать с PostgreSQL для встраивания специфичных для PostgreSQL операторов в один и тот же файл?

Я хотел бы сделать свое приложение переносимым на обеих платформах, но в некоторых случаях я могуне найти общий способ ведения дел и нужно делать конкретные вещи БД.Например, размещение автоматически увеличенного столбца в таблице на этих механизмах БД совершенно отличается, но большинство других частей схемы БД точно такие же и могут использоваться совместно.Поэтому я бы предпочел включить в дистрибутив только один файл create-the-database.sql, так как его легче поддерживать и он выглядит лучше.

Ответы [ 4 ]

2 голосов
/ 02 августа 2011

Смиритесь с этим и создайте файл "postgresql.sql" и файл "mysql.sql". Это требует очень мало усилий. Вы можете перейти на old-school и использовать cpp (1), так что обе схемы находятся в одном файле и даже чередуются.

% cat foo.sql
#ifdef USE_POSTGRESQL
CREATE TABLE pg_epicness (
  -- PostgreSQL schema def
);
#elif USE_MYSQL
CREATE TABLE phail (
  -- idontcareaboutmyusers schema def
);
#endif
% cat foo.sql | cpp -DUSE_POSTGRESQL | grep -v ^# > postgresql.sql
% cat foo.sql | cpp -DUSE_MYSQL | grep -v ^# > mysql.sql

Не красиво, но, как вы сказали, вы искали взломать. Так как в ваших файлах .sql в любом случае не должно быть начальных символов фунта, это «безопасная иш».

0 голосов
/ 01 августа 2011

Если синтаксические различия достаточно структурно совместимы, вы, вероятно, можете использовать макроразложение. M4 - популярный портативный макропроцессор.Я использовал его на нескольких языках, которые изначально не поддерживали обработку макросов, включая SQL.

0 голосов
/ 01 августа 2011

Мне неизвестна эквивалентная функция в Postgres. Этот синтаксис в любом случае довольно ограничен: он работает только тогда, когда что-то «лишнее», а не «отличается».

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

0 голосов
/ 01 августа 2011

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

Вам потребуется провести отдельное тестирование для каждой платформы, но я бы ожидал, что в любом случае.

Препроцессор может быть таким же простым, как интеллектуальный поиск и замена, или может быть более сложным.

...