2011-08-01 5 views
3

次のような具体的なコメント構文を使用して、汎用/標準SQL内のMySQL固有のSQL-文を含めることが可能である:PostgreSQL固有のコードを移植可能なSQLに含めるには? MySQLでは

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

。これはhttp://dev.mysql.com/doc/refman/5.1/en/comments.htmlで記述されています。

PostgreSQLでPostgreSQL固有の文を同じファイルに埋め込むために使用できる同等の構文またはハックはありますか?

私のアプリケーションは両方のプラットフォームで移植可能にしたいと思っていますが、いくつかのケースでは、一般的なやり方を見つけることができず、DB固有のことをする必要があります。たとえば、テーブルに自動的にインクリメントされた列を置くことは、これらのDBエンジンではまったく異なりますが、DBスキーマのほとんどの部分はまったく同じであり、共有することができます。ですから、私はむしろメンテナンスしやすく、感じが良いので、ディストリビューションにdatabase.sqlファイルを1つだけ作成することにします。

答えて

0

私の最初の考えは、コードをコンパイルする際に前処理ステップを組み込むことで、各データベースの中間層を別々に生成できるということです。次に、使用するものを配布するか、アプリケーション内で設定を変更して、2つの間で切り替えることができます。

プラットフォームごとに別々のテストが必要ですが、とにかくそれを期待しています。

プリプロセッサはインテリジェントな検索や置換などの単純なものでも、より複雑なものでもかまいません。

+0

ありがとうございます!これは、別のプリプロセッサを使用すること以外に、これを行うにあたって賢明な方法がないようです。私は別のプリプロセッサを使用することを提案するいくつかの最初のものだったので、私はこの答えを私の受け入れられた答えとして選択しています。 – snap

0

構文上の相違が構造的に十分に互換性がある場合は、おそらくマクロ展開を使用できます。 M4は一般的な移植可能なマクロプロセッサです。 SQLなどのマクロ処理をネイティブにサポートしていない複数の言語で使用しました。

0

私はPostgresの同等の機能を認識していません。とにかくその文法はかなり制限されています。それは、「何か」が「余分」であるときにのみ機能します。

私がこれを行うために知っている唯一の方法はコードです。たとえば、INSERT文を作成する関数を記述します。関数にはPostgres用とMySQL用の2つのバージョンがあります。機能に差異を埋め込む。次に、実行時にフラグを設定するか、適切なサブクラスを作成するためのファクトリを持っているか、実行された適切な関数セットを得るためのものを持っています。

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ファイルに先頭のポンド文字は存在しないはずなので、それは "安全です"です。

関連する問題