2017-05-10 5 views
0

私はいくつかのデータベースエンジン(例えば、MySQL、PostgreSQLなど)と相互運用するscalaプログラムを作成します。JDBCを使用してテーブルクエリを作成すると、異なるデータベースエンジンで動作しない

SQLクエリを処理するためにJDBC APIを使用します。私はテーブルを作成するためにクエリを使用し、ユーザーが指定したフィールドを持つテーブルを作成したい場合、これらのフィールドはスペースやアクセント付きの単語を含むことができる名前です。例えば

、2つのフィールド、'列1''列2' VARCHARフィールドとしてとテーブルダミーを作成します。

フィールドに含まれるスペースを維持しながら、MySQLデータベースに対してこのクエリを書く、我々は次のようにクエリでバッククォートを使用する必要があります。同様に

CREATE TABLE dummy (`column 1` varchar(20), `column 2` varchar(20)); 

、PostgreSQLのために、このクエリを記述するための正しい方法スペースを保存している間:

CREATE TABLE dummy ("column 1" varchar(20), "column 2" varchar(20)); 

多分、別のデータベースエンジンの場合、このクエリを書く別の方法があります。

上記のconstrainstを使用してこのクエリを記述し、JDBCを使用して任意のデータベースエンジンで動作する標準的な方法はありますか?

ご回答いただきありがとうございます。

+0

構文でデータベース固有のニュアンスのいくつかを処理するHibernateのようなORMツールの使用を検討できます。 –

+2

いいえ。しかし、スペースとカラム名、大文字と小文字を区別する名前を扱うのは悪夢です。私はただそれを禁じるだろう。またはスペースをアンダースコアに置き換えます。 –

答えて

1

これはあなたの疑問に直接答えるものではありませんが、このように列の名前を付けない方がよいと思います。私はカラム名を「正規化」します(たとえば、スペースをアンダースコアに置き換えるなど)。

カラム名は、おそらくユーザに直接公開されるべきではありません。 カラムに「人間が判読可能な」名前が必要な場合は、それらを別のテーブルに保存します。または、スペースを維持するなどの単純な方法であれば、アンダースコアをスペースで置き換えてプロセスを逆にするだけです。

0

既に言及したように、空白、特殊文字、または予約語を列またはテーブル名として使用しないでください。それを安全にするために、データベース全体で大文字と小文字を区別する問題を避けるために、テーブル名とカラム名を引用符で囲むのが一般的です。 SQL-99標準の二重引用符( ")によると

CREATE TABLE "foo" ("id" VARCHAR(32), "bar" VARCHAR(64)) 

は識別子を区切るために使用されている。ケースが実際に使用するデータベースの種類に関係sensitivy、それは設定です。大文字またはあなたのテーブルを小文字となりますDBSがあります。カラム名彼らは時にはだけCREATE TABLEまたはALTER TABLEコマンドで引用されていない場合。ランタイムエラーにつながることができます。

CREATE TABLE fooについては、実際にFOOという名前のテーブルを作成することができます。SELECT * FROM fooを行うときは、テーブルfooため、エラーを取得する可能性があります存在しませんがテーブルFOOが存在します。多くのDBMSで作業しましたが、テーブル名とカラム名に引用符を使用する傾向があります。

重要な部分は、あなたが"foo""FOO"に等しいではなく、fooが使用DBMSに依存FOOに等しくなる可能性があるため、引用符を使用するときに書い小文字または大文字に固執する必要がありです。小文字でも大文字でも、引用符を使用している場合はそれに固執してください。

また、データベースに固有の列の種類(可能な場合はいつでもANSI SQLに固執する)を避ける必要があります。

しかし、手動でデータベースを移行するのは非常に面倒でエラーが発生しやすいです。私は、移行ツール(flyway db)を使うことを提案したり、滑らかなようなライブラリによって移行を作成させることができます。

スカラーについて言及しましたが、スカラのための優れた機能データベースレイヤーであるSlick(http://slick.lightbend.com/)をご覧ください。他にもたくさんありますが、私はそれを重く使って、それを推薦することができます。

+0

いいえ、テーブル、列、およびその他の識別子の名前を引用すると、大文字と小文字の区別が問題となります。 –

+0

あなたのコメントに関する回答が更新されました。 – jan0sch

関連する問題