如何在可移植SQL中包含PostgreSQL特定的代码?

时间:2011-08-01 15:27:41

标签: sql postgresql syntax portability

在MySQL中,可以通过使用特定的注释语法在通用/标准SQL中包含特定于MySQL的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 个答案:

答案 0 :(得分:2)

将其解压缩并创建“postgresql.sql”文件和“mysql.sql”文件。这需要很少的努力。您可以去老派并使用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文件中不应该有任何前导字符,所以它是“安全的”。

答案 1 :(得分:0)

我首先想到的是,在编译代码时我会包含一个预处理步骤,然后可以分别为每个数据库生成一个中间层。然后,您可以分发要使用的任何一个,或者在应用程序中设置一个设置,以允许它在两者之间切换。

您需要对每个平台进行单独测试,但无论如何我都希望如此。

预处理器可以像智能搜索和替换一样简单,也可能更复杂。

答案 2 :(得分:0)

如果语法差异在结构上足够兼容,您可以使用宏扩展。 M4是一种流行的便携式宏处理器。我已经在几种语言中使用它,这些语言本身不支持宏处理,包括SQL。

答案 3 :(得分:0)

我不知道Postgres中的等效功能。无论如何,这种语法是非常有限的:只有当某些东西是“额外的”而不是“不同的”时它才有效。

我知道这样做的唯一方法是使用代码。例如,编写一个函数来创建INSERT语句。有两个版本的函数:一个用于Postgres,另一个用于MySQL。嵌入功能上的任何差异。然后在运行时设置一个标志或有一个工厂来创建适当的子类或其他什么来获得正确执行的函数集。