kbmMWでデータベース操作を簡略化する – 既存データベースの取り込み機能

kbmMWはデータベーステーブルのメタデータ解析機能を備えており、新バージョンではこの機能を強化して既存テーブルからORMエンティティクラスを自動生成できるようになります。これにより、クエリ実行やデータ保存、メタデータ操作(フィールド追加/変更/削除)が可能になります。

ORMの設計では、テーブル構造変更に伴う作業を抽象化するのが目的です。kbmMWではORMクラスの変更とCreateOrUpgradeメソッド呼び出しでデータベースアップグレードが可能です。これは過去のREST関連記事で説明済みです。

新バージョンでは、ORMがDelphiコードを生成してテーブル構造にマッチするエンティティクラスを作成します。FireDAC経由でSQLite/MSSQL/MySQL/Oracleなどに接続し、ImportDBSchemaツールでテーブル選択→コード生成が可能です。

以下はMySQLデータベースからテーブルをインポートする例です:

FireDAC接続設定ダイアログでデータベース選択 インポート対象テーブルを選択 生成するUnitファイル名を指定 インポート処理開始

生成されたUnitファイル(ensembl_utils.pas)には次のようなコードが含まれます:

unit ensembl_utils;
 
interface
 
uses
  DB,
  Math,
  Classes,
  System.Generics.Collections,
  kbmMWGlobal,
  kbmMWObjectMarshal,
  kbmMWNullable,
  kbmMWORM,
  kbmMWRTTI;
 
 
type
 
[kbmMW_Table('name:aedes_aegypti_core_48_1b.dna')]
TAedes_aegypti_core_48_1b_dna = class
private
  FSeq_region_id:integer;
  FSequence:string;
public
  [kbmMW_Field('name:seq_region_id, primary:true', ftInteger)]
  [kbmMW_NotNull]
  property Seq_region_id:integer read FSeq_region_id write FSeq_region_id;
 
  [kbmMW_Field('name:sequence', ftWideMemo)]
  [kbmMW_NotNull]
  property Sequence:string read FSequence write FSequence;
 
end;
 
[kbmMW_Table('name:aedes_aegypti_core_48_1b.gene')]
TAedes_aegypti_core_48_1b_gene = class
private
  FGene_id:integer;
  FBiotype:string;
  FAnalysis_id:word;
  FSeq_region_id:integer;
  FSeq_region_start:integer;
  FSeq_region_end:integer;
  FSeq_region_strand:byte;
  FDisplay_xref_id:kbmMWNullable<integer>;
  FSource:string;
  FStatus:kbmMWNullable<string>;
  FDescription:kbmMWNullable<string>;
  FIs_current:byte;
public
  [kbmMW_Field('name:gene_id, primary:true', ftInteger)]
  [kbmMW_NotNull]
  property Gene_id:integer read FGene_id write FGene_id;
 
  [kbmMW_Field('name:biotype', ftString, 40)]
  [kbmMW_NotNull]
  property Biotype:string read FBiotype write FBiotype;
 
  [kbmMW_Field('name:analysis_id', ftSmallInt)]
  [kbmMW_NotNull]
  property Analysis_id:word read FAnalysis_id write FAnalysis_id;
 
  [kbmMW_Field('name:seq_region_id', ftInteger)]
  [kbmMW_NotNull]
  property Seq_region_id:integer read FSeq_region_id write FSeq_region_id;
 
  [kbmMW_Field('name:seq_region_start', ftInteger)]
  [kbmMW_NotNull]
  property Seq_region_start:integer read FSeq_region_start write FSeq_region_start;
 
  [kbmMW_Field('name:seq_region_end', ftInteger)]
  [kbmMW_NotNull]
  property Seq_region_end:integer read FSeq_region_end write FSeq_region_end;
 
  [kbmMW_Field('name:seq_region_strand', ftShortInt)]
  [kbmMW_NotNull]
  property Seq_region_strand:byte read FSeq_region_strand write FSeq_region_strand;
 
  [kbmMW_Field('name:display_xref_id', ftInteger)]
  property Display_xref_id:kbmMWNullable<integer> read FDisplay_xref_id write FDisplay_xref_id;
 
  [kbmMW_Field('name:source', ftString, 20)]
  [kbmMW_NotNull]
  property Source:string read FSource write FSource;
 
  [kbmMW_Field('name:status', ftWideString, 19)]
  property Status:kbmMWNullable<string> read FStatus write FStatus;
 
  [kbmMW_Field('name:description', ftWideMemo)]
  property Description:kbmMWNullable<string> read FDescription write FDescription;
 
  [kbmMW_Field('name:is_current', ftShortInt)]
  [kbmMW_NotNull]
  property Is_current:byte read FIs_current write FIs_current;
 
end;
 
 
implementation
 
 
initialization
 
  TkbmMWRTTI.EnableRTTI([TAedes_aegypti_core_48_1b_dna, TObjectList<TAedes_aegypti_core_48_1b_dna>,
    TAedes_aegypti_core_48_1b_gene, TObjectList<TAedes_aegypti_core_48_1b_gene>]);
  kbmMWRegisterKnownClasses([TAedes_aegypti_core_48_1b_dna, TObjectList<TAedes_aegypti_core_48_1b_dna>,
    TAedes_aegypti_core_48_1b_gene, TObjectList<TAedes_aegypti_core_48_1b_gene>]);
 
end.

クラス名にスキーマ名を含めたくない場合は「スキーマ名を除外」チェックボックスを使用してください。未サポートデータ型がある場合、 UNKNOWN型としてマークされます。

生成されたクラスをアプリケーションに追加し、MySQL接続情報を設定すれば、以下のようにクエリが可能です:

var
  lst:TObjectList<TAedes_aegypti_core_48_1b_dna>;
begin
  lst:=CustomORM.QueryList<TAedes_aegypti_core_48_1b_dna>([2000],mwoqoGT);
...
end;

変更内容は次のコードで永続化できます:

CustomORM.Persist(lst);

さらに、新しいデータベース作成も可能です:

CustomORM.CreateOrUpgradeTable([TAedes_aegypti_core_48_1b_dna,TAedes_aegypti_core_48_1b_gene])

タグ: kbmMW Delphi ORM FireDAC MySQL データベース自動生成

6月24日 01:13 投稿