2011年12月20日火曜日

insert文の勉強

既に登録されているデータならばinsertを行わないSQL文

selectで登録済みかどうかをチェックしてからinsertする・・という発想になり
2つのSQL文を発行していました
いつも、これを1度にまとめられないものかと思いながら・・

今回は1つのSQL文で上記のことを行うようにしました
DBはPostgreSQLです

例)
テーブル:table1
カラム:value1, value2

insert into table1 (value1, value2)
select 'value1', 'value2' from table1
where not exists (
select * from table1 where value1 = 'value1'
) limit 1


(空で書いたので実行できないかもしれません)

複数のテーブルが関連するような複雑なものではなく、
1つのテーブルに、単純にレコードを挿入する際に、
重複登録を避けたいための文です

limitがいけてない気もします・・
not existsだけでは複数行該当する→複数回挿入してしまう→そうだlimitだ
という発想です・・
ど、どうなのでしょうか
よりよい手段を見つけたいです

2011年12月14日水曜日

Butterfly Persistenceのboolean型

Butterfly Persistenceを利用する機会があり、
booleanのテーブルの値が取れていない事に気付きました。

ソースコードをDLして調べてみました
Booleanをマッピングするところの型チェックが不足しているようです

PostgreSQLでは(←ポスグレだけなのかはよくわかりませんが・・)
boolean型はjava.sql.Types.BIT型を返しているようでした。

なので、if文を
(java.sql.Types.BOOLEANまたはBIT) ならば〜
という条件にしてみると、無事booleanのテーブル値が取れました。

jarにする時は、JDKは1.5でビルドしないと通りませんでした。
(最初1.6にしてしまって、エラーの嵐に・・)

2011年11月26日土曜日

SQLiteをVisualStudioで使う

文字列が化けてハマりました。。

VS2010, SQLite3, c++
「マルチバイト文字」を使用するプロジェクト環境です


・DBはUTF-8で作成
sqlite3_open_v2を使ってオープン。

・文字列の書き込みはUTF-16
SJIS -> UTF-16に変換したLPBYTEの文字列をsqlite3_bind_text16で書き込み。
MultiByteToWideChar(CP_ACP, ... )で変換します

・文字列の読み出しもUTF-16
sqlite3_column_text16で読み出したものをLPBYTEにキャスト、
UTF-16 -> SJISに変換して文字列を取得。
WideCharToMultiByte(CP_ACP, ... )で変換します


何故かわかりませんが、
DBと文字列を共にUTF-8で扱うと化けたので、
文字列の方を16で扱っています・・何でだろう。。
更に、DBと文字列を共にUTF-16で扱うと、これもまた化けてしまいました

どこかで何か間違えたのだろうか。うーん。。
もう少し試してみる必要がありそうです。


ついでにハマった(引っかかった)ことは、
bind〜が「1」originなのに、
column〜が「0」originだということ。
絶妙なる引っかけ・・。初心者にはキビシイっす

2011年10月21日金曜日

PostgreSQL interval

PreparedStatementでintervalを使う時にはまったのでメモ。

例えば、
now() + interval '10 days'
というようなことをしたい時、
「interval '10 days'」の部分を

1)
「?」にする。
PGInterval a = new PGInterval();
a.setDays(10);
PreparedStatementでsetObject(n, a);

2)
「cast (? as interval)」にする。
PreparedStatementでsetString(n, "10 days");

1か2のどちらかで出来ました。

2011年8月6日土曜日

Lucene(環境構築)

超初心者がひとまずJavaで動かせれば充分、の段階まで書いています。
まずは環境の整備です。

 
・eclipse
HeliosのIDE Developers for Javaを入れます。
日本語化は、Pleiadesの本体のみをダウンロードのコーナーから落としました。
features, pluginsフォルダの中身をコピーします。

Macってフォルダが置き換わるのが怖いですね。
コピーのつもりがうっかり置き換えたことが何度もあります・・!
注意してフォルダの中身をコピーです。。



・Luceneを入れる
Apache Lucene Core 3.3をダウンロードします。
解凍してできたluceneのフォルダは、お好きな場所へ配置します。

・lucene-core-3.3.0.jar
これプロジェクトのjarに追加すると、
luceneのあれこれを利用できるようになります。


・日本語の形態素解析
今回は、「日本語の形態素解析をせよ」というお題を課せられておりますので、
日本語に対応した形態素解析ができるライブラリを追加します。
lucene-coreには、上記のようなものは含まれておりませんでした。

そこで「sen」というライブラリを使用する記事を多く見受けたのですが、
2011年真夏の今となっては、senは活動休止のようです。なんたる。

と思ったら、lucene-gosenというライブラリがありました。
http://code.google.com/p/lucene-gosen/


lucene-gosen-1.1.1-naist-chasen.jarをダウンロードしました。
ipadicの方と、naistの方とは、どちらがどう違うのか、まだ調べておりません。
そのうち調べましょう。。
上記のjarをプロジェクトに追加しました。
これでJapaneseAnalyzerが使えます


・N-Gram解析
形態素解析だけでなく、NGram解析も試してみます。
N-Gram解析をするためには、NGramTokenizerを使うらしい…のですが、
lucene-coreを追加しただけでは、見えていません。

lucene-3.3.0/contrib/analyzers/common/lucene-analyzers-3.3.0.jar
これを追加すると、ngram関係が使えるようになりました


環境の整備はここまでです。
ソースコードは、そのうち・・