Можно ли написать сценарий SQL для MySQL и PostgreSQL? - PullRequest
2 голосов
/ 15 февраля 2011

Я хотел бы написать один сценарий SQL, который будет запускаться при установке по умолчанию MySQL или PostgreSQL (версии 5.5 и 9.0 соответственно). Возможно ли это?
Я почти могу сделать это, добавив SET SESSION sql_mode='ANSI'; в начало скрипта и используя стандартные запросы ANSI, но эта строка недопустима для PostgreSQL. Я мог бы сказать PostgreSQL, чтобы он продолжал на ошибках, но было бы неплохо иметь скрипт, который работает без ошибок.

Ответы [ 5 ]

4 голосов
/ 15 февраля 2011

Можно ли написать сценарий SQL для MySQL и PostgreSQL?

Да.

Следующий вопрос, пожалуйста!

..

Хорошо, со всей серьезностью, это вполне выполнимо, , но вы должны осознавать, что каждый из них делает по-своему.Например, если вам нужно использовать bytea в PG, а BLOB в MySQL, вам будет очень весело получить правильную кодировку / экранирование.Тогда есть такие вещи, как полнотекстовый поиск.В PG он встроен, в MySQL он встроен только в один тип таблицы (MyISAM, sucky), и синтаксис совершенно другой.И это даже не касается наборов символов и сопоставлений.

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

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

3 голосов
/ 15 февраля 2011

Попробуйте использовать условные комментарии:

/*! SET SESSION sql_mode='ANSI'; */

PostgreSQL проигнорирует его, MySQL запустит его. Для получения дополнительной информации см. документы .

Обновление : Если вы хотите включить команды, которые запускаются только на PostgreSQL, но не на MySQL, вы можете использовать тот факт, что PostgreSQL поддерживает вложенные комментарии, а MySQL - нет. В следующем примере показано, как это можно использовать:

/*! SELECT 'MySQL' rdbms_type; */
/*/**/-- */ SELECT 'postgres' AS rdbms_type;

Но это, вероятно, затруднит чтение файла.

1 голос
/ 15 февраля 2011

Установите режим на сервере, которого нет в сценарии:

Вы можете установить режим SQL по умолчанию, запустив mysqld с параметром --sql-mode = "mode" или используя sql-mode = "mode" в my.cnf (операционные системы Unix) или my.ini (Windows).

http://dev.mysql.com/doc/refman/5.5/en/server-sql-mode.html

Очевидно, что в сценарии вы собираетесь использоватьсамый низкий общий доминант черт, которые оба принимают.Известно также, что MySQL имеет самый стандартный совместимый синтаксический анализатор, но это не значит, что на самом деле он будет что-то делать (хороший способ получить Gotcha'd, поскольку оба сценария будут работать, но поведение может быть совершенно другим).Postgresql также не соответствует ANSI.Это может быть ближе всего, но у него есть множество уникальных вещей.Не похоже на идеальный способ.

ORM усердно трудится над тем, чтобы сделать то же самое - избавиться от боли.

1 голос
/ 15 февраля 2011

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

http://troels.arvin.dk/db/rdbms/

0 голосов
/ 20 июня 2017

Добавление

SET SESSION sql_mode='ANSI';

Без условий (?) Решает проблему установки библиотеки ulogin php.Также полезно добавить use database;, если вы уже создали его в командной строке.

...