JDBC でSaaS、ビッグデータ、NoSQL のメタデータを取得する
データの理解は、分析から変換、保存、レプリケーションまで、あらゆるプロセスにおいて重要です。JDBC 標準は、Java アプリケーションからプログラム的に、または JDBC 対応ツールやアプリケーションを通じて、データベースのメタデータにアクセスするための簡単な方法を提供します。CData JDBC Driver を使用すれば、110以上のデータソースのメタデータにアクセスでき、RDBMS、SaaS、ビッグデータ、さらには NoSQL データをリレーショナルモデルとして扱うことができます。
この記事では、CData JDBC Driver を Java コードで使用してデータソースに接続し、メタデータを取得・表示する方法を解説します。これにより、データへの理解を深め、より効果的に活用できるようになります。サンプルコードでは CData JDBC Driver for Salesforce を使用していますが、同じ原則はすべての CData JDBC Driver に適用できます。
データへの接続
データソースのメタデータを取得するには、まずデータソースに接続する必要があります。CData JDBC Driver をまだインストールしていない場合は、30日間の無料トライアルをダウンロードしてください。実際のデータがあるデータソース用のドライバーを使用してください。
ドライバーをダウンロードしてインストールしたら、データに接続する準備が整います。新しい Java プロジェクトを作成し、JDBC ドライバーをビルドパスに追加します。
- Eclipse の場合:
- プロジェクトを右クリックし、Build Path -> Add External Archives を選択します。
- JDBC Driver の JAR ファイル(例:cdata.jdbc.salesforce.jar)を指定します。
- IntelliJ の場合:
- プロジェクトを右クリックし、Open module を選択します。
- Project Settings の Libraries に移動し、Add をクリックして JDBC JAR ファイルを追加します。
ドライバーをビルドパスに追加したら、データソースに接続するためのコードを見ていきましょう。まず、ドライバーをロードし(JDBC 4.0 以降では任意)、DriverManager クラスを使用してデータソース(ここでは Salesforce)への接続を作成します。接続するには、必要な接続プロパティと値を渡した JDBC URL を設定する必要があります(必要なプロパティの詳細は、各データソースのオンラインヘルプドキュメントを参照してください):
String sfURL = "jdbc:salesforce:User=user@domain.com;Password=my_sf_password;SecurityToken=my_sf_security_token;";
//任意
Class.forName("cdata.jdbc.salesforce.SalesforceDriver");
Connection sfConn = DriverManager.getConnection(sfURL);
接続が作成できたら、データソースのメタデータを取得していきましょう。
テーブルとビューの取得
Java の DatabaseMetaData インターフェースの getTables メソッドを使用すると、データソースからテーブルの一覧を取得できます。データソースによって、これらのテーブルやビューは様々なデータセットを表します。SaaS API のシンプルな REST エンドポイントから、NoSQL データベースによく見られる階層データ構造まで、多岐にわたります。CData ドライバーは、データソースに関係なく、わかりやすいデータモデルを提供するように設計されています。以下のコードで Salesforce からテーブルとビューの完全な一覧を取得できます:
サンプルコード
//メタデータを取得
DatabaseMetaData sfMeta = sfConn.getMetaData();
//すべてのテーブルとビューを取得
ResultSet rs = sfMeta.getTables(null, null, "%", null);
//結果を出力
while (rs.next()) {
System.out.println(rs.getString("TABLE_NAME"));
}
出力例
AcceptedEventRelation Account AccountCleanInfo AccountContactRole ... VerificationHistory VisualforceAccessMetrics Vote WebLink
結果をテーブル、ビュー、システムテーブル、またはそれらの組み合わせに限定したい場合は、getTables メソッドの type パラメータに文字列配列を渡します:
- テーブル:getTables(null, null, "%", new String[]{"TABLE"})
- ビュー:getTables(null, null, "%", new String[]{"VIEW"})
- システムテーブル:getTables(null, null, "%", new String[]{"SYSTEM TABLE"})
上記のサンプルコードではテーブル名のみを表示しています。参考までに、getTables メソッドは以下のカラムを返します:
| カラム名 | データ型 | 説明 |
|---|---|---|
| TABLE_CAT | String | テーブルカタログ |
| TABLE_SCHEM | String | テーブルスキーマ |
| TABLE_NAME | String | テーブル名 |
| TABLE_TYPE | String | テーブルタイプ |
| REMARKS | String | テーブルの説明 |
データソースのテーブルを把握したら、getColumns メソッドを使用して、指定したテーブルのカラム情報を取得できます。
カラムの取得
Java の DatabaseMetaData インターフェースの getColumns メソッドを使用すると、データソースの選択したテーブルからカラムの一覧を取得できます。tableNamePattern パラメータを使用すると、テーブル名で結果を絞り込むことができます。CData ドライバーがサポートする SaaS、ビッグデータ、NoSQL データソースでは、既存のデータ構造(SaaS API の REST レスポンスの一部や NoSQL ドキュメントの構造内の個々の要素など)がドライバーの設定に基づいて解析され、データソースに関係なくデータベースのようなモデルとして提供されます。以下のコードサンプルで、Salesforce の Account テーブルのカラム一覧を取得します:
サンプルコード
//メタデータを取得
DatabaseMetaData sfMeta = sfConn.getMetaData();
//"Account" テーブルのカラムを取得
ResultSet rs = sfMeta.getColumns(null, null, "Account", null);
//結果を出力
while (rs.next()) {
System.out.println(rs.getString("COLUMN_NAME"));
}
出力例
Id IsDeleted MasterRecordId Name ... NumberofLocations__c UpsellOpportunity__c SLASerialNumber__c SLAExpirationDate__c
「__c」で終わるカラムに注目してください。これらは JDBC ドライバーを通じて Salesforce API から取得されたカスタムカラムです。ドライバーはメタデータを動的に取得してカラムを検出するため、カスタムフィールドの追加や削除は再接続時に反映されます。
サンプルコードでは、リクエストしたテーブルのカラム名のみを表示しています。参考までに、getColumns メソッドは取得した各テーブルに対して以下のカラムを返します:
| カラム名 | データ型 | 説明 |
|---|---|---|
| TABLE_CAT | String | データベース名 |
| TABLE_SCHEM | String | テーブルスキーマ |
| TABLE_NAME | String | テーブル名 |
| COLUMN_NAME | String | カラム名 |
| DATA_TYPE | int | java.sql.Types で定義された定数の値で識別されるデータ型 |
| TYPE_NAME | String | ドライバーが使用するデータ型名 |
| COLUMN_SIZE | int | カラムの文字数または数値精度 |
| BUFFER_LENGTH | int | バッファ長 |
| DECIMAL_DIGITS | int | カラムのスケールまたは小数点以下の桁数 |
| NUM_PREC_RADIX | int | 基数 |
| NULLABLE | int | カラムが null を許容するかどうか。JDBC DatabaseMetaData 定数で定義:columnNoNulls (0) または columnNullable (1) |
| REMARKS | String | カラムの説明 |
| COLUMN_DEF | String | カラムのデフォルト値 |
| SQL_DATA_TYPE | int | 仕様により予約済み |
| SQL_DATETIME_SUB | int | 仕様により予約済み |
| CHAR_OCTET_LENGTH | int | バイナリおよび文字ベースのカラムの最大長 |
| ORDINAL_POSITION | int | カラムのインデックス(1から開始) |
| IS_NULLABLE | String | null 値が許容されるかどうか:YES または NO |
| SCOPE_CATALOG | String | 参照属性のスコープとなるテーブルカタログ |
| SCOPE_SCHEMA | String | 参照属性のスコープとなるテーブルスキーマ |
| SCOPE_TABLE | String | 参照属性のスコープとなるテーブル名 |
| SOURCE_DATA_TYPE | int | DISTINCT 型のソース型、またはユーザー生成の Ref 型。DATA_TYPE が DISTINCT でない場合、この値は null。ユーザー生成の Ref の場合も null |
| IS_AUTOINCREMENT | String | Salesforce によってカラム値が固定増分で割り当てられるかどうか |
| IS_GENERATEDCOLUMN | String | カラムが生成されたものかどうか:YES または NO |
| ISREADONLY | boolean | カラムが読み取り専用かどうか |
| ISKEY | boolean | カラムがキーかどうか |
データソースのテーブルとカラムを把握できたら、データに対して分析、変換、その他の操作を効果的に実行する準備が整います。
あらゆるデータソースのメタデータ取得
CData では、110以上の SaaS、ビッグデータ、NoSQL データソースに対応した JDBC Driver を提供しており、データソースのメタデータを簡単に取得できます。すべてのドライバーが JDBC 標準に準拠しているため、データソースに関係なく一貫したメタデータクエリを実行できます。革新的なデータ処理機能により、CData ドライバーは NoSQL データに対しても信頼性の高いデータベースのようなモデルを提供します。30日間の無料トライアルをダウンロードして、CData の違いをぜひ体験してください。