Databene Benerator-通電する

「辞書を取り出して、カタルシスとは何かを確認してください。」 これが彼が私たちを殺そうとするものであるなら、私はそれが何であるかを知りたいのです。」(C)それを分析してください!



はじめに



64のテーブルのデータベースの設計がほぼ完了し、それらを埋めるためのインターフェイスがまだ開始されていなかった夕方遅く、データをどのように埋めるかという疑問が生じました。

手動で入力してください-アイデアはすぐに捨てられました。

「何かする必要がある!」魂が叫んだ。

「何かをダウンロードする必要がある!」-心を主張した!

その結果、インターネット上でスクランブルをかけ、インストール済みとSaaSの両方の有料および無料のソリューションを約10種類見つけました。 また、ロシア語の記事で、機能と構文の説明(1)、および彼女(英語)があります(2)。 私は理解しています-これはあなたが必要とするものです! しかし、どこで入手できますか? Windowsで使用する方法は? 便利ですか? ロシア文字をサポートしていますか?



したがって、「カタルシス」(3)は古代哲学の概念です。 さまざまな要因が人に与える影響を促進、浄化、高揚させるプロセスと結果の用語。



これは出版のトピックとどのように関係していますか? これを読めば理解できます。 カットしてください!



Eclipseでプロジェクトを作成する



「発電機」に関する前述の記事に記載されていることは、私にはまったく適していませんでした。

  1. 私は仕事にWindowsを使用しています。
  2. 私はGUIが大好きです(猫のような弱点...わかりました)。
  3. MySQLを使用できますが、PostgreSQLは使用できません。
  4. ロシア語のデータも必要です。


上記の少なくとも1つがあなたに適している場合、それはあなたと私が異なる道、またはこの道への異なる入口を持っていることを意味します!



まず、ジェネレーター自体を取得する必要があります。このため、次の場所にフォームを入力する必要があります。

bergmann-it.de/download/download_benerator?lang=en

[ダウンロード]をクリックします。



公開時点では0.9.8が使用可能ですが、0.9.7を使用しましたが、実際には、バージョン0.8.1の最新のマニュアルがこのマニュアル(4)であるため、違いに気付かないでしょう。



サイトのマニュアル(http://databene.org/download/databene-benerator-manual-0.7.6.pdf)のバージョンとジェネレーターのバージョンを比較して、偶然に偶然見つけました。 私はマニュアルのアドレスでバージョンを選択し始めましたが、0.8.1を見つけるのは驚くべきことでした!!! それ以上の検索は失敗しました...



そして、あなたはそれをやった! 私たちの手の中、すなわち あなたの指先のアーカイブ「databene-benerator-0.9.7」(あなたは新鮮です)。 今、それについてどうするか。



「D:\ databene-benerator-0.9.7」に解凍します。



そして、シャーマニズムは純粋になりました:フォーラムでmavenが言及されています-この獣が誰であるかはわかりませんが、それがなくても機能すると言います!

トリッキーな操作ではないので、アーカイブの内容を確認します。 何かを開始するバッチファイル(またはshスクリプト)もあります... benerator.batはbenerator_common.batを開始し、java.exeを開始します。 最初のbenerator.xmlのパラメーター内。 libフォルダーへの2番目のパスには、* .jarがあります...

当時、私はJava開発用の2つのIDE(NetbeansとEclipse)のみで作業しようとしました。 Googleに「databene Benerator eclipse」という質問をし、「 databene.org/databene-benerator/115-my-first-ide-based-benerator-project.html 」という応答を受け取りましたが、公式サイトのページからこのページへのリンクはありません!





ここで、Eclipseが必要です。まだダウンロードしていない場合は解凍します。 どのバージョンでもかまいません。 私はPHPに少し精通しているので、あなたは私の選択を推測するでしょう。 ところで、ジェネレーターを操作するためのEclipse作業ウィンドウ(いわゆるパースペクティブ)の場所は、PHPよりも便利です(右上隅で選択できます)。

そして、Eclipseを起動して、プロジェクトを作成します。

「ファイル->新規->プロジェクト...」を選択します



次に、「Javaプロジェクト」を選択し、「次へ->」をクリックします。

表示されるウィンドウで、プロジェクトの名前「generatedb」を入力し、「プロジェクトフォルダーをソースおよびクラスファイルのルートとして使用」としてプロジェクトレイアウトを選択し、「次へ->」をクリックします。

[ライブラリ]タブに切り替え、[外部JARの追加...]をクリックします。 開いたウィンドウで、「D:\ databene-benerator-0.9.7 \ lib」に移動し、そこにあるすべてのファイルを選択します。

完了をクリックします。 プロジェクトが作成されます。

ただし、ジェネレーターを起動するには、「スターター」を構成する必要があります!

「実行->実行構成...」を選択します。



表示されるウィンドウで:

1.「Java Aplication」でRMBを作成し、「New」を選択します。

2.次に、「名前」は実行する構成の名前を示します。

3.次に、「プロジェクト」は変更されません。

4.「メインクラス」に「org.databene.benerator.main.Benerator」と入力します。

5. [適用]をクリックします。

まだ「実行」をクリックした場合、「コンソール」タブに異なる呪いの多数の行が表示されますが、それらはすべてロシア語ではありません。 これは、最も重要なことを行っていないためです。 それで、私たちは何を待っていますか?



プロジェクト構造



今度は、benerator.xmlファイルとlog4j.xmlファイルをプロジェクトに追加します。ベネレーターが誓約したことはありません。

プロジェクトエクスプローラーでプロジェクトを右クリックし、[新規]、[XMLファイル]の順に選択し、ファイル名を入力して[完了]をクリックします。

benerator.xml-メインプロジェクトファイル。テーブルで行うすべてのことを記述します。

log4j.xml-ログ用ツールの構成ファイル。構成に応じて、ジェネレーターがコンソールに何を吐き出すか(サービス情報)。



「log4j.xml」の内容は次の形式に縮小されます。

log4j.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false"> <!-- Append messages to the console --> <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> <param name="Target" value="System.out"/> <param name="Threshold" value="debug"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p (%t) [%c{1}] %m%n"/> </layout> </appender> <!-- Limit categories --> <category name="org.apache"> <priority value="warn"/> </category> <category name="org.databene"> <priority value="info"/> </category> <!-- <category name="org.databene.commons"> <priority value="debug"/> </category> --> <category name="org.databene.COMMENT"> <priority value="debug"/> </category> <category name="org.databene.benerator.STATE"> <priority value="info"/> </category> <category name="org.databene.domain"> <priority value="info"/> </category> <category name="org.databene.SQL"> <priority value="debug"/> </category> <!-- ======================= --> <!-- Setup the Root category --> <!-- ======================= --> <root> <priority value="info"/> <appender-ref ref="CONSOLE"/> </root> </log4j:configuration>
      
      









「benerator.xml」の内容は次の形式に縮小されます。

benerator.xml
 <?xml version="1.0" encoding="UTF-8"?> <setup xmlns="http://databene.org/benerator/0.9.7" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://databene.org/benerator/0.9.7 benerator-0.9.7.xsd" defaultEncoding="UTF-8" defaultDataset="RU" defaultLocale="ru" defaultLineSeparator="\r\n" defaultSeparator=";"> <import platforms="db,csv" /> <import defaults="true" domains="organization,address,person,net" /> <import class="org.databene.benerator.distribution.function.*, org.databene.benerator.primitive.*,org.databene.platform.db.*"/> <import class="org.databene.commons.TimeUtil"/> <database id="db" url="jdbc:mysql://localhost:3306/qs?characterEncoding=UTF-8" driver="com.mysql.jdbc.Driver" user="root" password="" catalog="qs"/> <memstore id="memstore"/> </setup>
      
      









主なシナリオといくつかの実用的なソリューション



「benerator.xml」のいくつかのポイントについて説明しましょう。最初のロシア語の記事とバージョン0.8.1のマニュアルで詳細に検討されています。

ここで、urlパラメーターの魔法の行「characterEncoding = UTF-8」は、ロシア語の文字をデータベースに転送する問題を解決します(ロシア語の文字だけでなく)。



サイトの開発者もこれに言及するのを忘れていました。 まあ、それは彼らの懸念ではありません。 jdbcドライバーの構成行はJavaアプリケーションに共通であるため、非検索リソースのどこかに見つかりました。



再生成する前にデータベーステーブルをクリアする

まず、ファイル「truncate_tables.mysql.sql」(テキスト)を準備します

truncate_tables.mysql.sql
 SET foreign_key_checks = 0; --truncate table s_person; --truncate table s_job_title; --truncate table s_organization; --truncate table s_department; --truncate table t_orgstructure; --truncate table s_type_project; --truncate table s_direction_project; --truncate table s_norm_labor; --truncate table s_timetable; SET foreign_key_checks = 1;
      
      









最初と最後の行は、テーブルの整合性チェックを無効および有効にします。 そうしないと、あるテーブルが別のテーブルによるレコードの削除をブロックするときに状況が発生する場合があります(参照整合性)。

行-特定のデータベーステーブルをクリアするコマンド。 次の原則に従ってグループ化することが望ましい:

1.ディレクトリの別のグループ(他のグループに関連付けられていない)

2.次に、グループをすでに完成したテーブルにカスケードできます。

クリーニング-グループ全体として、または一度に1つずつ、ただし依存関係を監視します。

テーブルのコメントは便利で、繰り返しデータを柔軟に生成できます。



benerator.xmlで、memstoreを定義した後、次の行を追加します。

  <comment>  </comment> <execute uri="truncate_tables.mysql.sql" target="db" />
      
      





警戒してください! ジェネレーターの起動後-コメントされていないテーブルはクリアされます!



テーブルを削除してデータベースを作成する-このような操作をここで行うことは、私の意見では価値がありません。 モデルとデータベースを同期するための便利なツールがあります。 MySQL Workbench(5)を使用します。



スクリプトを... JavaScriptに埋め込みます!? はい、はい!

benerator.xmlで、 実行を決定した後、次の行を追加します。

 <comment>  </comment> <execute uri="script.js" type="js"/>
      
      





ファイル「script.js」(テキスト)を作成します

script.js
 function toLink (str) { var space = ''; str = str.toLowerCase(); var transl = { '': 'a', '': 'b', '': 'v', '': 'g', '': 'd', '': 'e', '': 'e', '': 'zh', '': 'z', '': 'i', '': 'j', '': 'k', '': 'l', '': 'm', '': 'n', '': 'o', '': 'p', '': 'r','': 's', '': 't', '': 'u', '': 'f', '': 'h', '': 'c', '': 'ch', '': 'sh', '': 'sh','': space, '': 'y', '': space, '': 'e', '': 'yu', '': 'ya' } var link = ''; for (var i = 0; i < str.length; i++) { if(/[-]/.test(str.charAt(i))) { //   -  ,    link += transl[str.charAt(i)]; } else if (/[a-z0-9]/.test(str.charAt(i))) { link += str.charAt(i); //   -    ,     } else { if (link.slice(-1) !== space) link += space; //         space } } return link; } function cut(str, cutStart, cutEnd){ return str.substr(cutStart,cutEnd); }
      
      









最初の関数は、ロシア語の文字の英語への音訳を実行します((5)から取得、マイナーリビジョンを使用)。

2番目-文字列を切り取ります。



コードでJavaScriptを使用する例:

 <generate type="s_organization" count="20" consumer="db,ConsoleExporter"><variable name="sgn" script="{js: (p.gender.name()=='MALE') ? sgnMALE : sgnFEMALE}"/> <attribute name="email" type='string' script="{js:toLink(p.givenName+p.familyName)+'@'+d}" converter="ToLowerCaseConverter, UniqueStringConverter"/> <variable name="theme_tmp" type='string' generator="new SeedSentenceGenerator('csv/notes.txt',3)" /> <attribute name="theme" maxLength="45" script="{js:cut(theme_tmp,0,44)+'.'}"/></generate>
      
      





主なアイデア:{js:}内のスクリプトパラメーターのすべてがJavaScriptの本質です。 変数は透過的に渡されます;他の方法では、これは使用例から見ることができます。

条件付きifステートメントの略記法にすでに気付いていますか?



生成を容易にするための個別のファイルでのデータベーステーブルの分散

各テーブル、または独立したファイル「* .ben.xml」で生成を個別に実行できない2〜3個の相互接続されたテーブルのグループを選択すると便利でした。 各ファイルは、個別の生成の便宜上、個別にコメント化されます。

注:これらのファイルの拡張子は* .ben.xmlでなければなりません。

メインファイルでは、次のようになります。

 <!-- <include uri="table.s_organization.ben.xml" /> --> <!-- <include uri="table.s_job_title.ben.xml" /> --> <!-- <include uri="table.s_type_doc.ben.xml" />-->
      
      





サンプルファイル「table.s_organization.ben.xml」(XML)

table.s_organization.ben.xml
 <?xml version="1.0" encoding="UTF-8"?> <setup xmlns="http://databene.org/benerator/0.9.7" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://databene.org/benerator/0.9.7 benerator-0.9.7.xsd" defaultEncoding="UTF-8" defaultDataset="RU" defaultLocale="ru" defaultLineSeparator="\r\n" defaultSeparator=";" > <comment>[[POPULATE TABLE s_organization]] Processed...</comment> <generate type="s_organization" count="20" consumer="db,ConsoleExporter"> <attribute name="bik" type='string' pattern='[0-9]{9}'/> <variable name="c" generator="CompanyNameGenerator" dataset="US" locale="us"/> <attribute name="caption" type='string' script="c.fullName" /> <attribute name="short_caption" type='string' script="c.shortName" /> <attribute name="form_sobs" type='string' script="c.legalForm" /> <variable name="a" generator="AddressGenerator" dataset="US" locale="us"/> <attribute name="ur_strana" type='string' script="a.country" /> <attribute name="ur_index" type='string' pattern="[0-9]{6}"/> <attribute name="ur_nas_punkt" type='string' script="a.city" /> <attribute name="ur_ulica" type='string' script="a.street" /> <attribute name='ur_dom' type='int' min='1' max='150' /> <attribute name='ur_office' type='int' min='1' max='100' /> <attribute name="telefon" type="string" script="a.officePhone" unique="true" /> <attribute name="faks" type="string" script="a.fax" unique="true" /> <variable name="d" generator="DomainGenerator" dataset="US" locale="us"/> <variable name="p" generator="PersonGenerator" dataset="RU" locale="ru"/> <variable name="tag1" source="memstore" type="sgnMALE" distribution="random"/> <variable name="tag2" source="memstore" type="sgnFEMALE" distribution="random"/> <variable name="sgn" script="{js: (p.gender.name()=='MALE') ? sgnMALE : sgnFEMALE}"/> <attribute name="email" type='string' script="{js:toLink(p.givenName+p.familyName)+'@'+d}" converter="ToLowerCaseConverter, UniqueStringConverter"/> <attribute name="webpage" type='string' script="d" converter="ToLowerCaseConverter, UniqueStringConverter"/> <attribute name="fio_ruk" type='string' script="p.familyName +' '+ p.givenName +' '+ sgn.secondgiven"/> <attribute name="rschet" type='string' pattern="[0-9]{20}"/> <attribute name="kschet" type='string' pattern="[0-9]{20}"/> <attribute name="INN" type='string' pattern="[0-9]{10}"/> <attribute name="KPP" type='string' pattern="[0-9]{9}"/> <attribute name="date_update" type="datetime" generator="dtGen"/> <attribute name="note" type='string' generator="new SeedSentenceGenerator('csv/notes.txt',3)" maxLength="255"/> </generate> <comment>[[POPULATE TABLE s_organization]] End. OK!</comment> </setup>
      
      









構造は「benerator.xml」に似ていますが、データベースへの接続と共通モジュールの接続を記述する必要はありません。 これらはすべて、メインの構成ファイルで既に行われています。



おわりに



さて、なぜ私は「カタルシス」を経験したのですか-この苦痛の後、すべてがうまくいきました

1. databene-beneratorが起動され、タブレットにデータが2〜3泊で充填され、緊急タスクを解決するための便利なツールができました。

2.彼はロシア語の文字を理解していることがわかりました。Javaプロジェクトでjdbcドライバーにアクセスするための構文についての知識がほとんどないというのは私の考えではありません(構文は普遍的です)。

3.テーブルを埋めるためのアルゴリズムは1つずつ進み、毎晩私のプレッシャーの下でgaveめました。 そして、64のテーブルすべてが6晩で完成しました。

はい、さらに多くの質問がありますが、主な質問が明らかにされ、タスクが完了し、知識が得られ、経験が得られます。 テーブルのエントリの量と品質を変更するために、手でそれらを「シャベル」する必要はありません。 ジェネレーターは数分でその仕事をします。



この記事では以下を考慮していません。

1.相互接続されたテーブルの生成、

2.日付と時刻の操作、

3.実数の生成。

ただし、この情報はリンクがある投稿とドキュメントにあります。 そのため、このような加速の後、読者はこれらの問題をマスターするのにそれほど困難はありません。



特に記事については、githubに登録し、例を整理するのに役立つソースを投稿しました。 それらを使用するには、* .zipアーカイブの形式でダウンロードし、解凍します。 新しいプロジェクトを作成し、「ファイル->インポート->一般->ファイルシステム」にインポートします。 プロジェクト全体をマークして、[完了]をクリックします。 「ランチャー」とジェネレーターのライブラリを必ず追加してください。



ご清聴ありがとうございました!



使用材料



1. habrahabr.ru/post/169713 [オンライン]

2. sysmagazine.com/posts/169713 [オンライン]

3. ru.wikipedia.org/wiki/Katarsis [オンライン]

4. databene.org/download/databene-benerator-manual-0.8.1.pdf [オンライン]

5. dev.mysql.com/downloads/workbench 。 [オンライン]

6. ajaxs.ru/lesson/javascript/137-transliteracija_stroki_na_javascript.html [オンライン]



All Articles