データベースで学ぶ(Groovyスクリプト)

groovyの小さなスクリプトのトピックの続き-もう1つ。

前:Gmailのビッグレター 、追加演習 (LATEX)



新しいスクリプトは、GroovyでXMLとデータベースを操作する基本を示しています。 タスクとして、居心地の良いZhZhshkiをXMLからデータベースに保存することを選択します。

どうしてですか? -SQLは、私たち(または他の誰か)のLJに関するすべてを教えてくれます-トピック、コメント、タグ-統計を収集するのに十分な想像力



まず、LJをXMLでダウンロードする必要があります。

これは他の誰かのユーティリティによって行われます-ljdump

Pythonをインストールし、IDLE(Python GUI)を開き、そこにユーティリティをロードして実行する必要があります。 彼女はすべてを尋ねます。



実行後、ファイルLXXX-投稿およびCXXX-コメントを含むディレクトリが作成されます。



そして、これらのXMLでスクリプトを実行します。

この形式では、Pure Javaの組み込みHypersonicデータベース(HSQLDB)を使用しますが、もちろん任意に接続できます。 JDBCドライバーがクラスパスにあることを確認してください。



このタイプのデータベースの解析と操作は、スクリプトと小さなプログラムにのみ適しています。 企業では、すべてのXMLをメモリにロードしたり(SAXを使用したり)、SQLを直接送信したりすることはありません(接続プール、準備されたステートメント、バッチ、ある種のHibernateがあります)。



パーシムは次のようになります。



<?xml version="1.0"?> <event> <itemid>1</itemid> <eventtime>2006-04-09 16:52:00</eventtime> <url>http://my-ljnick.livejournal.com/460.html</url> <event_timestamp>1144601520</event_timestamp> <reply_count>3</reply_count> <props> <commentalter>1148051408</commentalter> </props> <subject>  </subject> <event>      </event> <anum>204</anum> </event>
      
      







スクリプトは次のとおりです。



 import groovy.sql.Sql import java.sql.Timestamp def sql = Sql.newInstance("jdbc:hsqldb:file:lj", "sa", "", "org.hsqldb.jdbcDriver") // delete table if previously created try { sql.execute("drop table POST")} catch (Exception e) {} try { sql.execute("drop table COMMENT")} catch (Exception e) {} // create table sql.execute('''create table POST ( id integer not null primary key, url varchar(100), subject varchar(100), text varchar(10000), postdate timestamp )''') sql.execute('''create table COMMENT ( id integer not null primary key, postid integer, user varchar(100), subject varchar(100), text varchar(10000), commentdate timestamp, parentcomment integer )''') sql.execute(''' alter table COMMENT add constraint c_postid foreign key (postid) references POST (id) ''') def dir = "D:\\development\\ljdump-1.5.1\\my_lj\\" List<File> files = new File(dir).listFiles().findAll { it.name.startsWith("L") } files.each { record -> def event = new XmlSlurper().parse(record) int id = Integer.parseInt(event.itemid.text()) Date d = Date.parse("yyy-MM-dd HH:mm:ss", event.eventtime.text()) //No time zone java.sql.Timestamp sqlDate = new java.sql.Timestamp(d.time) String url = event.url.text() String subject = event.subject.text() String text = event.event.text() sql.execute("insert into post (id,url,subject, text, postdate) values ($id, $url, $subject,$text,$sqlDate )") File commentsFile = new File(dir + record.name.replace('L', 'C')); if (commentsFile.exists()) { def comments = new XmlSlurper().parse(commentsFile).comment comments.each() { comment -> String state = comment.state.text() if (!"D".equals(state)) { // not deleted int commentid = Integer.parseInt(comment.id.text()) String user = comment.user.text() String parentIdStr = comment.parentid.text() int parentid = 0; if (!parentIdStr.isEmpty()) Integer.parseInt(parentIdStr) Date commentDate = Date.parse("yyy-MM-dd HH:mm:ss", comment.date.text().replace('T',' ')) Timestamp sqlCommentTime = new Timestamp(commentDate.time) String commentsubject = comment.subject.text(); String body = comment.body.text() sql.execute("insert into comment (id,user,subject,text,commentdate,parentcomment, postid) values ($commentid,$user, $commentsubject, $body, $sqlCommentTime, $parentid, $id)") } } } } sql.close();
      
      







もちろん、改善できます:

1.投稿の作成者を保持する(コミュニティを解析する場合は重要)

2.ファイルとデータベースURLを引数として含むディレクトリを取得する



スキームを改善できます:

1.タグを保存する

2.著者を別のテーブルに保存する

3.インデックスを追加する



Grabディレクティブを追加して、ドライバーをクラスパスに追加する必要がないようにできます(試しましたが、成功しませんでした:()



次に、このベースの使用方法を見てみましょう。

50以上のコメントを含む投稿のリストを作成します。

 @Grab('hsqldb:hsqldb:1.8.0.7') import groovy.sql.Sql Sql sql = Sql.newInstance("jdbc:hsqldb:file:lj", "sa", "", "org.hsqldb.jdbcDriver") sql.eachRow("select subject, url, (select count (*) from comment where postid = mypost.id) as numcom from POST as mypost order by numcom desc") { row -> if (row.numcom>50) println row}
      
      







以上です。

誰かが役に立つことを願っています。




All Articles