QtのORMの抂芁

はじめに





こんにちは、プログラマヌの皆さん



Qtの䞖界では、ここ1幎間、非垞に興味深いむベントが開催されおいたす。 ここには、バヌゞョン4.7の最新リリヌス、QMLの抂念、およびモバむルプラットフォヌムぞのラむブラリの重芁な統合がありたす。 Qtには最も正しいトロヌルがありたす。 私は圌らが䜕をしおいお、このラむブラリがどこで開発されおいるかが奜きです。 私は圌女が圌女のクラスで最高だず確信しおいたすが、Qtで曞いおいる人はすでにこれを知っおいたす。



幎間を通じお倉化しおいる䜕かがありたす。 Qtの堎合、ORMラむブラリがキノコのように次々ず珟れ始めたした。 聖地は空ですか 需芁がありたす、ここにオファヌがありたす。 この蚘事でQt ORMの䞖界で䜕が起こっおいるかを読んでください。 監芖察象のラむブラリで䜿甚される䜿甚法ずメカニズムに関する最倧限の情報を提䟛するようにしたす。 しかし、ORMはプログラミング゜リュヌションの非垞に耇雑なセットであるため、それらの1぀を完党に奉献するこずはできたせん。



この蚘事は、私自身のORMのために掲茉されたため、やや宣䌝的なものであるこずに泚意しおください。最善の意図。





QxOrm、ver。 1.1.1





著者/所有者 QxOrm France

サむト  公匏 、 SourceForgeで

ラむセンス GPLv3 +商甚

䟝存関係 Qt4.5+、ブヌスト1.38+

開発期間 2010幎の初め、最埌の倉曎は2010幎4月です

ドキュメント 䞍完党、フランス語

䟋 はい、最も基本的な



開発の䞻な目暙は 、氞続性QtSql経由、シリアル化boost ::シリアル化経由、およびリフレクションのメカニズムを提䟛するこずです。



ラむブラリは非垞に匷力に芋え、倚くのこずを実行できるようです。 DAO デヌタアクセスオブゞェクト の原理に基づいお構築され、テヌブルに行を衚瀺するクラスがあり、いく぀かのメ゜ッドを䜿甚するず、そのような行のリストがデヌタベヌスから取埗されたす。 これを可胜にするために、QxOrmは、テンプレヌト倚くのテンプレヌト、マクロ、継承、単玔な耇数を含む非垞にトリッキヌなメカニズムを䜿甚したす。 あなたがプログラミングのトリックが奜きな人や、たずえばAlexandrescuが奜きな人にずっお、このコヌドは知り合いにずっお非垞に興味深いものです。



䟋、コヌド、説明から刀断するず、次の機胜が実装されおいたす。



長所



短所



逆説的に、すべおの䞍利な点を陀けば、QxOrmはほずんど唯䞀のQtず互換性のある本栌的なORM゜リュヌションです。 そしおこれは、耇雑なプロゞェクトにずっお重芁なキャッシングがある唯䞀の゜リュヌションです。 他のORMがQxOrmず比范される可胜性は䜎いため、この小さなレビュヌは他のレビュヌよりも倚いこずがわかりたす。 ただし、倧芏暡プロゞェクトでラむブラリを䜿甚する堎合、特に抜象リポゞトリではなく本栌的なDBMSで䜜業しおいる堎合は、他の可胜性が必芁になる堎合がありたすが、そうではありたせん。 䜕らかのバグを修正したいず思うでしょう-しかし、それはそれほど単玔ではありたせん。 たくさんの自転車ず束葉杖を発明する必芁がありたす。 プロゞェクトは必然的にキメラになりたす。 それどころか、いく぀かの優れた機胜だけが必芁な小さなプロゞェクトの堎合、ラむブラリは有甚です。Boostを匕き締めるこずを恐れない範囲で。



マッパヌクラスの䟋すべおのコヌドはドキュメントから取埗されたす


クラス薬

{

公開 

長い ID ;

QString名;

QStringの説明。



drug    id  0  { ; }

仮想 〜薬物  { ; }

} ;



QX_REGISTER_HPP_MY_TEST_EXE  drug、qx :: trait :: no_base_class_defined 、 1 





QX_REGISTER_CPP_MY_TEST_EXE  drug  //このマクロは、QxOrmコンテキストで 'drug'クラスを登録するために必芁です



名前空間 qx {

テンプレヌト <> void register_class  QxClass < drug >  t 

{

t。 id   drug :: id 、 "id"  ; // 'drug :: id' <=>䞻キヌをデヌタベヌスに登録したす

t。 data   drug :: name 、 "name" 、 1  ; //キヌ 'name'およびバヌゞョン '1'で 'drug :: name'プロパティを登録したす

t。 data   drug :: description 、 "desc"  ; // 'drug :: description'プロパティをキヌ 'desc'に登録したす

} }





䜿甚䟋


//ドラッグを保存するためにデヌタベヌスにテヌブル「ドラッグ」を䜜成したす

QSqlError daoError = qx :: dao :: create_table < drug >   ;



//コンテナからデヌタベヌスに薬物を挿入したす

//「d1」、「d2」、「d3」の「id」プロパティは自動曎新されたす

daoError = qx :: dao :: insert  lst_drug  ;



// 2番目の薬物を倉曎しおデヌタベヌスに曎新したす

d2- > name = "name2 modified" ;

d2- > description = "desc2 modified" ;

daoError = qx :: dao :: update  d2  ;



//デヌタベヌスから最初の薬物を削陀したす

daoError = qx :: dao :: delete_by_id  d1  ;



//デヌタベヌスに薬を数えたす

long lDrugCount = qx :: dao :: count < drug >   ;



// ID「3」のドラッグを新しい倉数に取埗したす

drug_ptr d_tmp ; d_tmp。 リセット 新薬   ;

d_tmp- > id = 3 ;

daoError = qx :: dao :: fetch_by_id  d_tmp  ;



//コンテナからXML圢匏のファむルに薬物を゚クスポヌトシリアル化

qx :: シリアル化 :: xml :: to_file  lst_drug、 "./export_drugs.xml"  ;



// xmlファむルから新しいコンテナにドラッグをむンポヌトしたす

type_lst_drug lst_drug_tmp ;

qx :: シリアラむれヌション :: xml :: from_file  lst_drug_tmp、 "./export_drugs.xml"  ;



//薬物のクロヌン

drug_ptr d_clone = qx :: clone  * d1  ;



//クラス名で新しい薬を䜜成したす工堎

boost :: any d_any = qx :: create  "drug"  ;



//ドラッグコンテナを 'qx :: cache'に挿入したす

qx :: キャッシュ :: set  "drugs" 、lst_drug  ;







QDjango、ver。 ???



投皿者 JeremyLainé、Bollorételecom

サむト  公匏 、 メヌリングリスト

ラむセンス GPLv3、LGPLv3

䟝存関係 Qt4.5+

2010幎6月3日から開発䞭

ドキュメンテヌション 完党な英語のdoxygen生成

䟋 はい、最も基本的です。



䞻な目暙 可胜な限りDjangoに䌌た、Qt甚の無料のORMを䜜成するこず。



この開発の長所ず短所に぀いお話すのは時期尚早ですが、ラむブラリはただ方法を知りたせん。 どうやら、これはDAO / Active Record-ORMになりたす。 珟圚、SELECTの生成、コンテナぞのデヌタの取埗、CREATE TABLE生成によるテヌブルの䜜成がすでに可胜です。 著者はすぐにWHERE生成を芏定し始めたした。 さらに、ANDおよびOR挔算子がサポヌトされおいたす。 ぀たり、マルチレベルフィルタヌを䜜成でき、フィルタヌを蚭定するための構文も成功したす。 開発では、QxOrmず同じメ゜ッドが積極的に䜿甚されたすテンプレヌト、継承...それらに基づいお、おそらく、著者は優れたOOPコヌドの巚倧なファヌムを䜜成するでしょう。

しかし、それだけです。 私たちは、1幎半で匷力なORMシステムがQDjangoから成長するず信じおいたすが、今のずころ、プロゞェクトでのそのアプリケヌションに぀いお話す必芁はありたせん。



著者からの䜿甚䟋。


//すべおのナヌザヌ

QDjangoQuerySet <ナヌザヌ> users ;



//パスワヌドが「foo」で、ナヌザヌ名が「bar」ではないすべおのナヌザヌを怜玢したす

QDjangoQuerySet < User > someUsers ;

someUsers =ナヌザヌ。 filter  QDjangoWhere  "password" 、QDjangoWhere :: Equals 、 "foo"  &&

QDjangoWhere  "username" 、QDjangoWhere :: NotEquals 、 "bar"   ;



//ナヌザヌ名が「foo」たたは「bar」であるすべおのナヌザヌを怜玢したす

someUsers =ナヌザヌ。 filter  QDjangoWhere  "username" 、QDjangoWhere :: Equals 、 "foo"  ||

QDjangoWhere  "username" 、QDjangoWhere :: Equals 、 "bar"   ;



//ナヌザヌ名が「f」で始たるすべおのナヌザヌを怜玢したす。

someUsers =ナヌザヌ。 filter  QDjangoWhere  "username" 、QDjangoWhere :: StartsWith 、 "f"   ;



//結果の数を制限する

someUsers =ナヌザヌ。 制限  0、100  ;



//䞀臎するナヌザヌの数を取埗したす

int numberOfUsers = someUsers。 サむズ   ;



//最初に䞀臎したナヌザヌを取埗したす

ナヌザヌ* firstUser = someUsers。 at  0  ;



//空きメモリ

firstUserを削陀したす。



//䞀臎するナヌザヌのナヌザヌ名ずパスワヌドのリストを取埗したす

QList < QList < QVariant >> propertyLists = someUsers。 valuesList  QStringList   << "username" << "password"  ;



//ク゚リセット内のすべおのナヌザヌを削陀したす

someUsers。 削陀   ;


ナヌザヌクラス


クラス User  public QDjangoModel

{

Q_OBJECT

Q_PROPERTY  QStringナヌザヌ名READナヌザヌ名WRITE setUsername 

Q_PROPERTY  QStringパスワヌドREADパスワヌドWRITE setPassword 



Q_CLASSINFO  "ナヌザヌ名" 、 "最倧長= 255" 

Q_CLASSINFO  "password" 、 "max_length = 128" 



公開 

QStringナヌザヌ名  const ;

void setUsername  const QString  username  ;



QString password   const ;

void setPassword  const QString  password  ;



プラむベヌト 

QString m_username ;

QString m_password ;

} ;




QtPersistence、ver。 0.1.1



投皿者 マット・ロゞャヌス

サむト  SourceForgeで

ラむセンス LGPLv3

䟝存関係 Qt4.5+

開発期間 2009幎末-2010幎初頭

ドキュメント なし

䟋 単䜓テストで悪い



䞻な目暙 Rubyのいく぀かのORMず同様に、Active Recordアプロヌチに基づいおQtのORMを䜜成したす。



ほずんど䜕も知らない別のラむブラリ。 さらに悪いこずに、開発されたせん。 著者はこのプロゞェクトを攟棄したようです。 実際、圌女ができるこずは、マッパヌクラスを䜿甚しおデヌタベヌスにデヌタを曞き蟌むこずだけです。



䜿甚䟋は、単䜓テスト自己蚘述型テストモゞュヌルに基づくにありたす。


クラス FakeBook  public QPersistantObject

{

Q_OBJECT

Q_PROPERTY  QString著者READ著者WRITE setAuthor 

Q_PROPERTY  int yearPublished READ yearPublished WRITE setYearPublished 

公開 

Q_INVOKABLE FakeBook  QObject * parent = 0   QPersistantObject  parent  { }

virtual〜FakeBook   { }



void setAuthor  const QString  a  { m_author = a ; }

QString author   const { return m_author ; }



void setYearPublished  int year  { m_yearPublished = year ; }

int yearPublished   const { return m_yearPublished ; }



プラむベヌト 

QString m_author ;

int m_yearPublished ;

} ;



FakeBook * b = 新しい FakeBook ;

b- > setAuthor  "Matt Rogers"  ;

b- > setYearPublished  2009  ;



bool objectSaved = b- > save   ;

削陀 b ;

ASSERT_TRUE  objectSaved  ;



b = 新しい FakeBook ;

b- > setAuthor  "マットロゞャヌスではない"  ;

b- > setYearPublished  1999  ;



objectSaved = b- > save   ;

削陀 b ;

ASSERT_TRUE  objectSaved  ;




QsT SQLツヌルQST、ver。 0.4.2aリリヌス



投皿者 Alexander Graninme :)

サむト  SourceForgeの フォヌラム

ラむセンス GPLv3、LGPLv3

䟝存関係 Qt4.5+

2009幎9月から開発䞭

ドキュメンテヌション 完党な、doxygen生成、ロシア語のみ

䟋 コヌドでは、単䜓テストです。 たた、バヌゞョン0.3および0.4甚の特別なTradeDBサンプルプロゞェクト本栌的なデヌタベヌスアプリケヌションも䜜成したした。



䞻な目暙は、Qtでのデヌタベヌスアプリケヌションのプログラミングを容易にするこずです。



ORMに぀いお話すのは簡単ではありたせん。 サンドボックスに蚘事を曞いお、Habrに着いたのは圌女のおかげでした。 蚘事は興味をそそりたせんでした...しかし、それはバヌゞョン0.3でした-そしお、リリヌスさえしたせんでしたが、プレアルファです。 今、私はQSTの開発にかなり螏み蟌んでおり、0.5.1プレアルファ版は既に利甚可胜です。 しかし、ただやるべきこずがたくさんありたす。



たず第䞀に、これは通垞のORMではありたせん。 私はラむブラリヌを曞き始めたしたが、甚語はただわかりたせんでした。 ク゚リを䜜成せず、1぀の局に集䞭させるために、ク゚リを生成するためのツヌルが必芁でした。ク゚リを远跡するのが簡単でした。 Active Recordのようなアプロヌチに぀いおは知りたせんでした。 その結果、䜕が起こったのかがわかりたす。それは独特のORMであり、正確なORMではありたせん。 テヌブルフィヌルドにマップするクラスフィヌルドを構成するこずはできたせん。 割り圓おのみを䜿甚しおデヌタベヌスにデヌタを盎接から曞き蟌む読み取るこずはできたせん。 しかし、あなたは他の倚くのこずをするこずができたす。



機䌚、圌らは図曞通のプラスです。



短所 もちろん、たくさんありたす





䞀般的に、ラむブラリはただ開発䞭ですが、すでに倚くのこずを知っおいたす。 私は仕事でそれを䜿甚したす。 フリヌランサヌずしお別のプロゞェクトを曞いおいたす。 䞀般に、䟋の゜ヌスコヌドからわかるように、プログラマヌはQxOrmたたはQDjangoを䜿甚するプログラマヌよりも䜜業がはるかに少なくなりたす。 ハンドラヌの説明、ビュヌのロヌド-ほずんどすべおがメむンクラスQstAbstractModelHandlerにある機胜を取埗したす。 私はゆっくりず必芁なものをすべお玹介したすが、い぀でも私に頌るこずができたす、私は間違いなく助けたす。 ずは察照的に。 したがっお、私はこの困難な事業で私をサポヌトするこずを控えめに提案したす。 幞運の願いでもありたすが; より良い-すべおのレビュヌ。 ありがたいです。



SELECTク゚リのハンドラクラスずDFD蚘述子の䟋。


QstFieldフィヌルドは、ビュヌのカスタマむズに関する情報フィヌルドの衚瀺可胜性、タむトル、列幅も送信するこずに泚意しおください。

// personshandler.h

const int PERSONS = 1 ;

const int PERSONS_FULL_NAME = 2 ;



クラス PersonsHandler  public QstAbstractModelHandler

{

プラむベヌト 



QstBatch _selector  const int  queryNumber  const ;

QstBatch _executor  const int  queryNumber  const ;

} ;



// personshandler.cpp

QstBatch PersonsHandler :: _selector  const int  queryNumber  const

{

QstBatchバッチ;



if  queryNumber == PERSONS 

{

バッチ。 addSource  "vPersons"  ;

batch << QstField  RolePrimaryKey、 "ID" 

<< QstField  "Address_ID" 



<< QstField  "LastName" 、FieldVisible、 "Last Name" 、 100 

<< QstField  "FirstName" 、FieldVisible、 "Name" 、 100 

<< QstField  "ParentName" 、FieldVisible、 "ミドルネヌム" 、 100 

<< QstField  "vcBirthDate" 、FieldVisible、 "Date \ n Birth" 、 90 

<< QstField  "Phone" 、FieldVisible、 "Contact \ n Phone" 、 120 

<< QstField  "[E-Mail]" 、FieldVisible、 "e-mail" 、 120 



<< QstField  "ID" 、倀 ID_VALUE  、PurposeWhere 

;

}

他に

if  queryNumber == PERSONS_FULL_NAME 

{

バッチ。 addSource  "vPersons"  ;

バッチ



<< QstField  "FullName" 、FieldVisible、 "Full Name" 、 300 

<< QstField  "LastName" 、FieldVisible、 "Last Name" 、 100 

<< QstField  "FirstName" 、FieldVisible、 "Name" 、 100 

<< QstField  "ParentName" 、FieldVisible、 "ミドルネヌム" 、 100 

<< QstField  "vcBirthDate" 、FieldVisible、 "Date \ n Birth" 、 90 

<< QstField  "Phone" 、FieldVisible、 "Contact \ n Phone" 、 120 

<< QstField  "[E-Mail]" 、FieldVisible、 "e-mail" 、 120 



<< QstField  "ID" 、倀 ID_VALUE  、PurposeWhere 





<< QstField  RolePrimaryKey、 "ID" 

<< QstField  "Address_ID" 

;

}

他に

{

Q_ASSERT  停  ;

}



バッチを返し たす。

}


ビュヌのカスタマむズ


// PersonsHandler _personsHandler;

// QstPlainQueryModel _personsModel; //-PersonsFormクラスで説明されおいたす。



void PersonsForm :: loadPersons  

{

_personsHandler。 reload  PERSONS、  _personsModel  ;

_personsHandler。 setTableView  ui- > tv_PersonsTableView  ;

}



QVariant PersonsForm :: personID   const

{

_personsHandlerを返したす。 keyValueOfView   ;

}


䜿甚法


void PersonsForm :: loadPersonalDocumentInfo  

{

PersonalDocumentsHandler th ;

番目。 setValue  "Person_ID" 、personID    ;

QVariantMap valMap = th。 SelectToMap  PERSONAL_DOCUMENTS、

QStringList  

<< "DocTypeName"

<< "シリアル番号"

<< 「番号」

<< "vcIssueDate"

<< "GivenBy"  ;

ui- > le_DocumentTypeLineEdit- > setText  valMap [ "DocTypeName" ] 。 toString    ;

ui- > le_SerialNumberLineEdit- > setText  valMap [ "SerialNumber" ] 。 toString    ;

ui- > le_NumberLineEdit- > setText  valMap [ "Number" ] 。 toString    ;

ui- > le_IssueDateDateEdit- > setDate  valMap [ "vcIssueDate" ] 。 toDate    ;

ui- > le_GivenByLineEdit- > setText  valMap [ "GivenBy" ] 。 toString    ;

}



All Articles