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])