来ましたね、Sybaseを利用されるのですね。
Sybaseをサポートしていないのは、少なくとも
0.8.xの時代の話ですが、
A. フリーで利用できる環境がない
B. Sybaseを使ってるプロジェクトが極少
だからです。
フリーで利用できるエディションがあればサポートはしやすく、
でも、そうでないにしても Sybase を使ってるプロジェクトが
多くて、jflute自身がプロジェクトで触る機会がある、利用者が
実質的にテスターになる、というのであれば、まだいいのですが、
そうでないものはやはりサポートできない、というところです。
(あと、JDBCドライバのライセンスもどうだったっけかな、
あんまり自由に使えなかったような気が...そこは忘れました)
とはいえ、単にある程度動くか動かないかっていう話であれは、
サポートしているものとサポートしていないの差は紙一重とも言えます。
今、最新版で sybase と指定したらどうなるかは試しました?
「デフォルトDB」という扱いで、ある程度動くか、
どこかでつまずいて落ちてしまうかですが、
サポートしてないDBでも、明示的に例外にしていることは
ないので、Firebird の話と似たような感じにはできなくは
ないと思います。
http://d.hatena.ne.jp/jflute/20101015/1287130707
情報を頂けて、試してもらえるのであれば、
SqlClauseのSybase版とか本体にコミット
するのはOKですよ。
> # (現時点でReplaceSchemaにおいて一度ですべてのSQLが実行出来ない問題
> (直接SQLを個別に実行することにより回避可能)があります。)
これなんでしょうね!?
何か具体的な例外は発生?
2010/11/25 しゃってん <schatt...@gmail.com>:
> --
> このメールは Google グループのグループ「DBFluteユーザの集い」の登録者に送られています。
> このグループに投稿するには、dbf...@googlegroups.com にメールを送信してください。
> このグループから退会するには、dbflute+u...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/dbflute?hl=ja からこのグループにアクセスしてください。
>
>
ちなみに、自分が昔 DBFlute + Sybase やってたときは、
Sybase は、12.x でした。(確か、恐らく)
えらく苦労したのを覚えています。
特にSQLのパフォーマンスチューニング周り。
簡単にインデックス検索を止めてくれるので、
マッピングの型とかすごく微調整しないと
いけなかったかな。あとは、お約束の
「バインド変数を止めると速くなる」
ConditionBeanの超スーパー非推奨機能の
EmbedCondition はそこから来た機能だったかな。
どうせ、若干サポート( < 準サポート < 正式サポート)
をするなら、15.x 対応にしたいですね。
2010/11/25 kubo <dbf...@gmail.com>:
> # *Failed to get connection meta: JZ0SJ: このデータベース上にメタデータ・アクセサの情報が見つかりませ
> ん。
> # jConnect マニュアルで説明されている必須テーブルをインストールしてください。
> (0.8.1では情報の取得はできていました。)
うわー、全然わけわかんないねぇ...
スタックトレースある?
0.8.1からちょっと変わったJDBCメソッドの使い方が、
Sybaseと相性が悪いのかもしれない。(Firebirdのときみたいに)
それがわかれば、if (Sybaseだったら) をやってしまえるのだけど。
あと、0.8.1 のときは、ReplaceSchema は動いてたけどなぁ...
実際のプロジェクトで ReplaceSchema をしっかり活用してた。
2010/11/26 しゃってん <schatt...@gmail.com>:
JZ0SJ は、色々と話題になってるね。
http://groups.google.com/group/sybase.public.sqlanywhere.general/search?q=JZ0SJ&start=10&sa=N&
少なくとも、0.8.1 で動くってことなので、
JDBC直接使ったプログラムを書いて、
Connectionを構築してみるといいかも。
すると、違いがわかってくるかも。
あと、DBFluteにSybase枠を作っておきました。
SqlClause とか DBWay とか。
とりあえず、SQLServerと同じものをコピーして
作っただけど、違う部分があれば修正します。
以下が、とりあえずコピーした状態そのまま。
o Identityの取得 => select @@identity
o ブロックコメント => サポートされている
o ラインコメント => サポートされている
o ScrollableCursor => サポートされている
o 一意制約違反のコード => errorCode が 2627
o ページングの offset 処理
=> サポートされてないのでカーソルのポインタシフト
o ページングの limit 処理 => select top N ...
o 更新ロックの取得 => with (updlock)
o NullsFirst/Last => order by 句で case when 方式
お、これは。。。
JZ0SJ は別問題ですね。INFOレベルのログなので、
これが原因で落ちているわけじゃないですね。
DatabaseMetaDataの getDatabaseProductName() とか
getDriverName() など接続情報が取得できなかったようですが、
落ちている原因は別のようですね。
> Unknown schema is NOT supported to use SQL prefix!
databaseInfoMap.dfprop の schema って何を指定してる?
(dbo ?)
2010/11/26 しゃってん <schatt...@gmail.com>:
> databaseInfoMap.dfprop で
>
> schema = iqdemo
>
> と指定して試してみてください。
間違えた。iqdemoはカタログ名(データベース名)かな。
schema = DBA
が正しいかな!?
2010/11/26 kubo <dbf...@gmail.com>:
さらにもう一個追加、まとめると:
databaseInfoMap.dfpropにて、
schema = DBA
で試すとどうなるか?
(もしかしたら、多分そうなってるのかな)
さらに
catalog = iqdemo
を追加するとどうなるか?
#
# SQLServer はどうなってたかなぁ...
#
おお、なるほど状況がわかった。
サポートされているDBMSでは、
catalog オプションは指定しなくてもURLから自動判別するけど、
Sybaseには対応していないのでうまくいかないようだ。
かつ、Sybaseが catalog の概念を持っていたと。
(catalog の概念のないDBMSも多いので)
とりあえず、それで試しておいて下さい。
後で、catalog 指定なしでも動くようにしますね。
jdbc:sybase:Tds:localhost:2638/iqdemo
なるほど、こういう形式なのね。
2010/11/26 しゃってん <schatt...@gmail.com>:
Schattenさん
catalog についてドキュメントでも触れるようにしておきました。
// databaseInfoMap - catalog | DBFlute
http://dbflute.sandbox.seasar.org/ja/manual/reference/dfprop/databaseinfo/index.html#catalog
// SQLSerer - データベース接続設定 | DBFlute
http://dbflute.sandbox.seasar.org/ja/manual/reference/dbway/sqlserver/index.html#setting
そして、DBFlute-0.9.7.6-10-SNAPSHOT で以下反映しました。
o catalog 設定なしでもURLから自動判別
o Sybase用の SqlClause と DBWay
o 今回の現象が発生したときの例外メッセージをもちょいリッチに
以下の情報がわかったら教えて頂けると助かります。
[Sybase仕様] ※今のところSQLServerのコピー
> そして、DBFlute-0.9.7.6-10-SNAPSHOT で以下反映しました。
試してみました。
JDBCタスクにてエラーが発生するようになりました。
Identityの情報を取得しようとしてる際に発生しているように思えます。
#
# 以下スタックトレースを貼り付けます。
#
2010-11-26 17:54:04,177 [main] INFO
(DfDBFluteTaskUtil#getBuildProperties():82) - ...Using
contextProperties: build.properties
2010-11-26 17:54:04,184 [main] INFO
(DfDBFluteTaskUtil#getBuildProperties():125) - [Build-Properties]:
size=1
2010-11-26 17:54:04,185 [main] INFO
(DfDBFluteTaskUtil#getBuildProperties():127) - torque.project = main
2010-11-26 17:54:04,185 [main] INFO
(DfDBFluteTaskUtil#getBuildProperties():129) -
2010-11-26 17:54:04,250 [main] INFO (DfDataSourceHandler#create():72)
- ...Creating data source:
2010-11-26 17:54:04,250 [main] INFO (DfDataSourceHandler#create():73)
- driver = com.sybase.jdbc3.jdbc.SybDriver
2010-11-26 17:54:04,251 [main] INFO (DfDataSourceHandler#create():74)
- url = jdbc:sybase:Tds:localhost:2638/iqdemo
2010-11-26 17:54:04,251 [main] INFO (DfDataSourceHandler#create():75)
- user = DBA
2010-11-26 17:54:04,285 [main] INFO
(DfDataSourceHandler#createConnection():161) - ...Connecting to the
database:
2010-11-26 17:54:04,681 [main] INFO
(DfDataSourceHandler#processConnectionMetaInfo():219) - *Failed to get
connection meta: JZ0SJ: このデータベース上にメタデータ・アクセサの情報が見つかりません。jConnect マニュアルで
説明されている必須テーブルをインストールしてください。
2010-11-26 17:54:04,684 [main] INFO
(TorqueJDBCTransformTask#doExecute():176) -
2010-11-26 17:54:04,685 [main] INFO
(TorqueJDBCTransformTask#doExecute():177) - ...Starting to process
JDBC to SchemaXML
2010-11-26 17:54:04,685 [main] INFO
(TorqueJDBCTransformTask#doLoadPreviousSchema():969) - ...Loading
previous schema (schema diff process)
2010-11-26 17:54:04,708 [main] INFO (DTDResolver#resolveEntity():123)
- ...Resolving XML by database.dtd in same package
2010-11-26 17:54:04,793 [main] INFO
(TorqueJDBCTransformTask#generateXML():229) - ...Instantiate DB-driver
2010-11-26 17:54:04,793 [main] INFO
(TorqueJDBCTransformTask#generateXML():232) - ...Getting DB-connection
2010-11-26 17:54:04,794 [main] INFO
(TorqueJDBCTransformTask#generateXML():235) - ...Getting DB-meta-data
2010-11-26 17:54:04,796 [main] INFO (DfTableHandler#doGetTableList():
68) - ...Getting tables:
2010-11-26 17:54:04,797 [main] INFO (DfTableHandler#doGetTableList():
69) - schema = {iqdemo.DBA as main}
2010-11-26 17:54:04,797 [main] INFO (DfTableHandler#doGetTableList():
70) - types = [TABLE, VIEW]
2010-11-26 17:54:04,833 [main] INFO
(TorqueJDBCTransformTask#generateXML():263) -
2010-11-26 17:54:04,833 [main] INFO
(TorqueJDBCTransformTask#generateXML():264) - $ /= = = = = = = = = = =
= = = = = = = = = = = = = = =
2010-11-26 17:54:04,834 [main] INFO
(TorqueJDBCTransformTask#generateXML():265) - $ [Table List]
2010-11-26 17:54:04,834 [main] INFO
(TorqueJDBCTransformTask#processTable():296) - $
iqdemo.DBA.MEMBER(TABLE)
2010-11-26 17:54:04,885 [main] ERROR (DfDBFluteTaskUtil#logException():
156) - Look! Read the message below.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Failed to execute DBFlute Task 'JDBC'.
[Advice]
Check the exception messages and the stack traces.
* * * * * * * * * */
java.lang.IllegalStateException:
org.seasar.dbflute.exception.DfJDBCException: Look! Read the message
below.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Failed to execute the SQL for getting auto-increment!
[SQL]
select MEMBER_ID from null where 0 = 1
SQL Anywhere -131 : 'null' 1
* * * * * * * * * */
at
org.apache.torque.task.TorqueJDBCTransformTask.doExecute(TorqueJDBCTransformTask.java:
210)
at
org.seasar.dbflute.task.bs.DfAbstractTask.execute(DfAbstractTask.java:
93)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:
288)
at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
25)
at java.lang.reflect.Method.invoke(Method.java:597)
at
org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:
105)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.Target.execute(Target.java:357)
at org.apache.tools.ant.Target.performTasks(Target.java:385)
at org.apache.tools.ant.Project.executeSortedTargets(Project.java:
1329)
at org.apache.tools.ant.Project.executeTarget(Project.java:1298)
at
org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:
41)
at org.apache.tools.ant.Project.executeTargets(Project.java:1181)
at org.apache.tools.ant.Main.runBuild(Main.java:698)
at org.apache.tools.ant.Main.startAnt(Main.java:199)
at org.apache.tools.ant.launch.Launcher.run(Launcher.java:257)
at org.apache.tools.ant.launch.Launcher.main(Launcher.java:104)
Caused by: org.seasar.dbflute.exception.DfJDBCException: Look! Read
the message below.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Failed to execute the SQL for getting auto-increment!
[SQL]
select MEMBER_ID from null where 0 = 1
SQL Anywhere -131 : 'null' 1
* * * * * * * * * */
at
org.seasar.dbflute.logic.jdbc.handler.DfAutoIncrementHandler.isAutoIncrementColumn(DfAutoIncrementHandler.java:
69)
at
org.apache.torque.task.TorqueJDBCTransformTask.isAutoIncrementColumn(TorqueJDBCTransformTask.java:
751)
at
org.apache.torque.task.TorqueJDBCTransformTask.processAutoIncrement(TorqueJDBCTransformTask.java:
422)
at
org.apache.torque.task.TorqueJDBCTransformTask.processTable(TorqueJDBCTransformTask.java:
324)
at
org.apache.torque.task.TorqueJDBCTransformTask.generateXML(TorqueJDBCTransformTask.java:
269)
at
org.apache.torque.task.TorqueJDBCTransformTask.doExecute(TorqueJDBCTransformTask.java:
188)
... 17 more
2010-11-26 17:54:04,957 [main] INFO (DfDataSourceHandler#destroy():
115) - ...closeReally()
2010-11-26 17:54:04,969 [main] INFO
(DfAbstractTask#showFinalMessage():198) -
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
[Task End]: 00m00s771ms *Abort
DBFLUTE_CLIENT: {main}
database = sybase
language = java
container = seasar
package = sample.dbflute
DBFLUTE_ENVIRONMENT_TYPE: {df:default}
driver = com.sybase.jdbc3.jdbc.SybDriver
url = jdbc:sybase:Tds:localhost:2638/iqdemo
schema = {iqdemo.DBA as main}
うおっっと、ごめん、これはケアレスミスでした。
ランタイムは変わらず(10-SNAPSHOT)で、
モジュールは、11-SNAPSHOTを出しました。
2010/11/26 しゃってん <schatt...@gmail.com>:
> DB側の文字コードはCHAR文字セットエンコードがISO_8859-1:1987
> でNCHAR文字セットエンコードがUTF-8
ISO_8859 だと、そもそも普通に登録した
日本語データが検索で全部化けなちゃわないかな!?
(どうなんだろう、そんなのやったことない...)
> デフォルト値が「autoincrement」の場合には、「autoIncrement="true" 」とするようにできますでしょうか?
なるほど、りょうかいです。
Sybase が ResultSetMetaData の方で AutoIncrement 情報を
取得できないってことのようですね。
それでは、if (Sybaseだったら) の第一弾いきますね。
DBFlute-0.9.7.6-12-SNAPSHOT を出しました。
(モジュールだけ)
> いろいろテストを行っていて驚いたのですが・・・
> SybaseでNull許可のカラムを作成する場合には明示的に「NULL」と宣言しないといけないのですね。
> 何も付けない場合(デフォルト)は「NOT NULL」が付与されているカラムとして処理されてしまいました。
> データベースの設定によるものかもしれませんが不思議な感じがしています。
ほー。それはちょっと良い心掛けかもしんない。
NotNull なのに、NotNull を付けないで作ってしまう方が
圧倒的に多いと思うので、デフォルトは NotNull で、
Null を許すなら明示的にね、ってのはいいね。
最初からそうなってないとできないことだと思うので、
もう他の DBMS がそうしようともできないことだけど...
2010/11/26 しゃってん <schatt...@gmail.com>:
DBFlute-0.9.7.6-13-SNAPSHOT を出しました。
来週のリリースを想定してちょっと整理しました。
一意制約違反エラーは、誤動作しても面白くないので、
とりあえずはサポートなし実装にして、一意制約違反エラーの
SQLState or エラーコードが分かり次第対応。
=> 一意制約違反起こして、SQLExceptionを探る
その他は、間違ってたら動かないはずので推測で実装。
更新ロック -> とりあえず "for update" で
=> lockForUpdate()のメソッドを呼んで落ちなければOK
ページングの limit 処理 -> とりあえず "top N" で
カーソルが Scrollable かどうか -> とりあえず true で
=> CBのページングがうまく動作すればOK
NullsFirst/Last は、恐らくサポートしてないと
思われるので OrderBy での CaseWhen 方式で実装。
=> withNullsFirst() を呼んで落ちなければOK
もし、動かせるようであれば、上記を試して情報頂ければ、
次のバージョンに間に合うようにします。
Schattenさん、ありがとうございます。
わかった情報を反映した DBFlute-0.9.7.6-14-SNAPSHOT を出しました。
>> => 一意制約違反起こして、SQLExceptionを探る
> ErrorCode:21
> で返ってきました。
了解です。
ErrorCode == 21 で EntityAlreadyExistsException にしておきました。
別の制約エラーでも 21 だったら悲しいけど、Sybase を信用しようかなw
(よければ、FK違反やNotNull違反も試して違う値であることを確認できればと)
>> 更新ロック -> とりあえず "for update" で
>> => lockForUpdate()のメソッドを呼んで落ちなければOK
> SQLは落ちずに正常終了。(本当にロックされているかは未検証)
>
>> ページングの limit 処理 -> とりあえず "top N" で
>> カーソルが Scrollable かどうか -> とりあえず true で
>> => CBのページングがうまく動作すればOK
> 意図した値が正常に取得できました。
了解です。
この辺は、「そういうSQL」が発行されていればOKとしましょう。
そこまでやっておいて、実はエラーにもならず動きもしない、
なんていったら Sybase 信用できないよねw
> # ReplaceSchema にてOUT_OF_DBSPACE 的なエラーの解消方法が分からず苦戦しているため
> # 細かいデータ検証までは行えていません。
> # (評価版に付属のデモ用データベース設定が原因な気はしますが・・・?)
> # 正規環境が整い次第再度テストを行ってみます。
なるほど、ややこしそうだね。
http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc00171.1500/html/iqnew/CEGGHFJG.htm
Sybase IQ 15.0 からの話っぽいね。
(だから、自分が Sybase 12.x でやってたときに
聞いたことないエラーなのかも)
2010/11/29 しゃってん <schatt...@gmail.com>:
>> 別の制約エラーでも 21 だったら悲しいけど、Sybase を信用しようかなw
>> (よければ、FK違反やNotNull違反も試して違う値であることを確認できればと)
> について、ErrorCodeはすべて「21」のようです。
> SQLStateがそれぞれ
> ・一意制約違反 => QGA03
> ・FK違反 => QSB48
> ・NotNull違反 => QDB51
> となっていました。
わーいw、ありがとう。
SQLStateの "QGA03" を使うようにしました。
こちら DBFlute-0.9.7.6-RC4 にて反映しました。
モジュールとランタイム両方反映が必要です。
(いよいよ大詰め)
> ErrorCode=QSB48, SQLState={3})が発生しました
> #
> # メッセージの置換場所が一つずつずれていたりします。
> # (これって他のDBMSの場合は正常に埋まっていましたっけ?)
ずれてる、っぽい...(h2 と oracle で試した)
色々と落ち着いたらフィードバックしてみるといいかも。
> デモ用データベースサーバインスタンス上にデータベースサービスは作れたのですが、
> JDBCタスクにてUKが存在しないテーブルのUK情報検索時にエラーとなってしまいました。
> (本体付属のデモ用データベースサービスでは起きていません。)
> データベースの設定やプロシジャの構成に違いがありそうなので、それが原因だと思いますが・・・
> (JDBCドライバがDBMeta情報を取得する際に内部でプロシジャをコールしてるようなスタックトレースが出てたりします。)
> エラーが発生するときとしないときでの差を探してみます。
> (JDBCが利用してるプロシジャのインストールを行っていないためと思いますが。)
ややこしいねぇ...がんばれー
> 一意制約違反のみEntityAlreadyExistsExceptionをスロー、
> その他の制約違反はSQLFailureExceptionとなりました。
> その他のSQL発行もエラーなしで実行出来ました。
ありがとう!
> いろいろと試してる中で、catalog を url から取得できるようにしていただきましたが、
> 明示的に指定するほうがいいかもしれないことに気がつきました。
> (直前ですいません。)
> 理由は、URLにその他のパラメータを付与することが可能であったり、
> マシン上にデータベースサービスが1つのみの場合、データベース名の指定を省略できてしまうためです。
> (データベース名を省略したところ、ポート番号がカタログ名に出力されてしまいました。)
なるほど。
パラメータは付与されても大丈夫なはず(考慮して実装してるはず)。
jdbc:sybase:Tds:localhost:2638/exampledb&charSet=UTF-8
jdbc:sybase:Tds:localhost:5432/exampledb?charSet=UTF-8
テストでは、上記どちらでも exampledb を抽出できています。
ただ、省略はやっかいだね。まあ、したら sybase の場合は、
とりあえず catalog を明示的に指定していた方が確実、って扱いで。
したら、日付変わったらリリースされる予定です。
また、何かあれば、それは次のバージョンのSNAPSHOTにて。
2010/11/30 しゃってん <schatt...@gmail.com>:
> パラメータは付与されても大丈夫なはず(考慮して実装してるはず)。
>
> jdbc:sybase:Tds:localhost:2638/exampledb&charSet=UTF-8
> jdbc:sybase:Tds:localhost:5432/exampledb?charSet=UTF-8
>
> テストでは、上記どちらでも exampledb を抽出できています。
余談。実装はこんな感じ。
final String pureUrl = Srl.substringFirstFront(_url, ";", "?", "&");
final String catalog = Srl.substringLastRear(pureUrl, "/", ":");
return !catalog.equals(pureUrl) ? catalog : null;
RC4 そのままで、DBFlute-0.9.7.6 をリリースしました。
さて、この後 Sybase でどんなびっくりが待っていることやら...
2010/11/30 kubo <dbf...@gmail.com>:
なるほど、CaseSensitiveというオプションがあって、
かつ、存在しない場合にエラーなんだね。
> ユーザテーブルのUK項目に「AAA」というデータと
> 「aaa」というデータが共存できなくなる副作用がでてくるという。
これは、まあ大丈夫です。
というのは、そもそもDBFluteで大文字小文字
区別したカラムはサポートされていないので。
どっちしろ、getAaa(), getAaa() でバッティングします。
Sybase と組み合わせる場合は「CaseSensittive=off」が
必須という扱いでいいかなと。
ただ、しゃってんさんの環境では、実務的にどうなのかな。
その設定で動かせそうなのかな?
(off にできないようであれば if (Sybase) かなぁ)
2010/12/1 しゃってん <schatt...@gmail.com>:
そうか、なるほど。
その CaseSensitive ってテーブル名の区別じゃなくて、
データの区別ってところなのかな。
で、メタデータの取得で指定するテーブル名は、
SQL上のテーブル名じゃなくて、内部テーブルの
データとしてテーブル名に当てると。
(CaseSensitive=On でも、SQL上のテーブル名や
カラム名は大文字小文字区別なく実行されるかな?)
ちなみに、以前MySQLでも似たようなことがあって、
PKのメタデータ取得だけパッチ処理してました。
整理して、Lower/Upperのリトライ取得に関しては、
例外を無視するようにしました。
(リトライなので、もともとそうするべきだったかも)
これで、どっちでも(OnでもOffでも)動くと思います。
DBFlute-0.9.7.7-00-SNAPSHOT (モジュールだけ)
に反映しました。
ちなみに、データとしての大文字小文字を区別も、
DBFluteとしては「あんまり」サポートしてません。
ほとんどの場面ではそのこと自体に関与しませんが、
例えば、PKの値が "AAA" と "aaa" で二つのレコード
に分かれているとき、(そもそもDB設計として非推奨)
LoadReferrer では一緒のレコードとして扱います。
(コード値の大文字小文字は区別しない)
2010/12/1 しゃってん <schatt...@gmail.com>:
> ちなみに、データとしての大文字小文字を区別も、
> DBFluteとしては「あんまり」サポートしてません。
> ほとんどの場面ではそのこと自体に関与しませんが、
> 例えば、PKの値が "AAA" と "aaa" で二つのレコード
> に分かれているとき、(そもそもDB設計として非推奨)
> LoadReferrer では一緒のレコードとして扱います。
> (コード値の大文字小文字は区別しない)
正確には、データとしての大文字小文字を区別する設定は
別にOKだけど、PKの値で別レコードで「A」と「a」とある場合は、
LoadReferrer や区分値メソッドではサポートされない、ってところかな。
// LoadReferrer - PKの値の大文字小文字 | DBFlute
// (ExBehaviorのオーバーライドでどうにでもなるけど)
http://dbflute.sandbox.seasar.org/ja/manual/function/ormapper/behavior/select/loadreferrer.html#caseinsensitive
※CDef の codeOf() も大文字小文字区別なしで探しに行きます。
っという間に、
DBFlute-0.9.7.7-01-SNAPSHOT
(モジュール、ランタイム両方)
を出しました。
LoadReferrer でオーバーライドで大文字小文字の区別しない挙動を
変更しやすいように、メソッド名をそれっぽいのに変更しました。
(いざってときの回避のために)
PKは一万歩譲って回避できるようにしても、区分値のコード値で、
"FOO" と "foo" は、やはり完全サポート対象外(にしたい)ですね。
(まあ、これもテンプレート触れば幾らでもですが)
2010/12/1 kubo <dbf...@gmail.com>:
別件も絡んで、
DBFlute-0.9.7.7-03-SNAPSHOT
が出ています。
あと、大文字小文字違いのPK値とか、
DBFluteで非推奨のDB構造をドキュメントに
まとめてみました。
http://dbflute.sandbox.seasar.org/ja/environment/supported.html#deprecateddata
2010/12/1 kubo <dbf...@gmail.com>:
しゃってんさん、確認ありがとうございます。
正式版は急がないかな?
どのみち、色々な人がSNAPSHOT使っているので、
予定より早めにリリースはしようと思ってるけど。
(本当は、元旦になった瞬間にリリースするつもりだった)
> 確かにユニークな項目や(特に)区分値では大文字小文字で重複した登録というのは
> 業務的にも避けるべき内容かもしれませんね。
区分値は論外として、まあ、万が一、業務コードに
そういうコードがあったとしても、サロゲートキーを
使っていれば問題はないんだけどね。
http://dbflute.sandbox.seasar.org/ja/manual/topic/dbdesign/surrogatekey.html
でも、業務コードでの大文字小文字の違いも業務する人の
こと考えてもやはり非推奨だけどね。電話とかでのコードの
やりとりで間違えまくりだし。大文字小文字だけでなく、
そもそも業務コードに「9」と「Q」を使わないとか、
一生懸命考えるもんだから。
(業務設計の現場で学んだ。会話で勘違いしやすいコードはOUT)
2010/12/7 しゃってん <schatt...@gmail.com>:
了解しました。
まあ、他の課題などと合わせてリリースタイミング計りますね。
実際には元旦にリリースしても同日のダウンロードは、
ほとんどないんですよね。
> 「サロゲートキーと複合主キー」についてはRDBを取り扱う人には
> 是非読んでもらいたい感じになってますね。
> (DBFluteを使う使わないによらず、テーブル設計を行わない人も含め)
ありがとう。正解がどうのこうのっていうより、
メリット・デメリットを分析してアプローチするっていう
考え方のきっかけになってほしいなと思っています。
※こういった記事、まだまだ書きたいことたくさんあるのだ...
2010/12/7 しゃってん <schatt...@gmail.com>:
ああ、なるほど、SQLServerと全く同じですね。
(って、歴史的経緯からそりゃそうなんだけど)
SELECT IDENT_CURRENT (テーブル名) AS IDENT_CURRENT
ってSQL通るかな?
Identityカラムを持ったテーブルであれば、
なんか値が帰ってくるはず。
これが通れば、SQLServer用のクラスを
そのままSybaseでも利用できるので。
2010/12/8 しゃってん <schatt...@gmail.com>:
> SELECT IDENT_CURRENT (テーブル名) AS IDENT_CURRENT
テーブル名をシングルクォートで囲う必要がありました。
SELECT IDENT_CURRENT ('テーブル名') AS IDENT_CURRENT
2010/12/8 kubo <dbf...@gmail.com>:
なーるほど、微妙に違うんだね。
set identity_insert TABLE_NAME on
-> set option identity_insert = 'TABLE_NAME'
set identity_insert TABLE_NAME off
-> set option identity_insert = ''
って、対応かな。
(テーブル名はクォートするでOKだよね?)
>> SELECT IDENT_CURRENT ('テーブル名') AS IDENT_CURRENT
> を実行してみましたがプロシジャが存在しないというエラーになりました。
で、こっちに対応するのが無いのね。
メタデータのデフォルト値の autoincrement を
見ないと判別できないのかな...ちょっと頑張ってみます。
ちなみに、Identityを持っていないテーブルで、
set option identity_insert = 'TABLE_NAME'
とやって insert したら例外になるかな?
2010/12/8 しゃってん <schatt...@gmail.com>:
とりあえず、やってみました。
DBFlute-0.9.7.7-07-SNAPSHOT でお試し下さい。
ログでも set option identity_insert が表示されるはずです。
2010/12/8 kubo <dbf...@gmail.com>:
ありがとう。それでは、
07-SNAPSHOTを上書きしました。
「temporary」になるはず。
>> ちなみに、Identityを持っていないテーブルで、
>> set option identity_insert = 'TABLE_NAME'
>> とやって insert したら例外になるかな?
> について結果は
> 「テーブルに Identity/Autoincrement カラムがありません。」
> でエラーとなりました。
なるほど、やっぱりダメだよね...
2010/12/8 しゃってん <schatt...@gmail.com>:
> 07-SNAPSHOTを上書きしました。
> 「temporary」になるはず。
「temporary」に変更されていることを確認いたしました。
MavenのSurfireレポートが出力できたので添付いたします。
ベースはdbflute-basic-exampleです。
DDL及びDBへの接続設定はSybaseに置き換え、
JDBC->Genarateを再実行しています。
replace-schema-30-sequence.sql 及び -replace-schema-90-vendorcheck.sql は
SQLの構文エラーが発生するため実行していません。
(take-finally.sqlもSQL構文エラーが出たので実行されないようにしています。)
外出しSQLで MemberBhv_selectPurchaseSummaryMember.sql だけ多少細工をしています。
・ページングでの limit をコメントアウト
・order by のコメントアウト(order by 区でサブクエリの結果を用いることができなかったため)
いくつかエラーが出てますがDB依存系のものと判断できるものばかりなので問題ないかと思います。
2010年12月8日17:10 kubo <dbf...@gmail.com>:
確認ありがとう。レポートも見ました。
ほとんどの機能が使えてますね。
「correlated UNION subqueries はサポートされていません」
そうなんだねぇ。
日時のミリ秒の精度がちょっと気になるかな。
SQLServerと同じような感じかな!?
2010/12/8 しゃってん <schatt...@gmail.com>:
バッチ更新のスレッドでもメールしましたが、
DBFlute-0.9.7.7-RC1 出しました。
(バッチ更新のカラム指定が反映されています)
これを使うと、そちらの sybase-example にて、
BehaviorPlatinumTest のバッチ更新が落ちると思います。
処理後の VersionNo の比較をしているところですが、
バッチ更新でも処理後のインクリメントされた VersionNo を
それぞれの Entity に反映するようにした影響です。
(直下の日本語の "F" だったかな!? の制限が改善されました)
2010/12/8 kubo <dbf...@gmail.com>:
>> (直下の日本語の "F" だったかな!? の制限が改善されました)
> 上記事象を確認いたしました。
> VersionNoを比較用に退避する場所で+1して保存し、Assertで正常に終了することも確認しました。
おお、ありがとう!
> # F. 更新後のEntityのVersionNoは更新前と全く同じ値がそのまま保持される。
> # ->更新後のEntityにはOnMemoryでインクリメントされたVersionNoが格納される。(0.9.7.7~)
> ということですね?
Yes it is.
近日、正式版をリリースします。
2010/12/13 しゃってん <schatt...@gmail.com>:
DBFlute-0.9.7.7 をリリースしました。
http://d.hatena.ne.jp/jflute/20101215
また、何かあればその後のバージョンでね。
本当はクリスマスイブの夜中にリリースして、
バッチ更新とかDerivedReferrerのネストとかScalarSelectとか、
サンタさんからのプレゼントだよ、ってしようかと思ったんだけど、
それで誰からも突っ込まれなかったら寂しいからね。
2010/12/13 kubo <dbf...@gmail.com>:
しゃってんさん、もしよければというところですが、
DBFlute-0.9.7.9-RC1 を Sybase で試して頂けないでしょうか?
o Behavior.varyingInsert() のオプションで IdentityInsert ができるように
new InsertOption().disablePrimaryKeyIdentity()
と指定すると、ReplaceSchemaのときと同じように、
set temporary_... が発行されて、指定したIDを直接登録する
ことができるはずです。(SQLServerでは確認済み)
できたばかりの varyingQueryInsert() でも同様です。
(これは、insert into ... select ... のオプションメソッド)
後は、デグレってないかどうか。
ReplaceSchema で IdentityInsert が変わらずできるかどうか。
2010/12/15 kubo <dbf...@gmail.com>:
しゃってんさん、ご確認ありがとうございます。
>> o Behavior.varyingInsert() のオプションで IdentityInsert ができるように
> の確認につきましては、もう少々お時間をいただきたいと思います。
了解です。ありがとう。
実装はこんな感じです。
Foo foo = new Foo();
foo.setFooId(3); // identity (本来は無視されるはずのIDが insert される)
foo.setFooName("test");
fooBhv.varyingInsert(foo, new
InsertOption<FooCB>().disablePrimaryKeyIdentity());
2011/1/14 しゃってん <schatt...@gmail.com>:
あと、DBFlute-0.9.7.9-RC2 が出ています(EMechaから)。
(Sybase周りの処理では RC1 から変わってないけど)
0.9.7.9 はやることやったという感じになるので、
そっちの Sybase 周りの話で何かあればというところで。
2011/1/15 kubo <dbf...@gmail.com>:
おおお、しゃってんさん、ありがとう。
insert into select も動きましたか、良かった。
(ドキュメントないのにも関わらずありがとう)
ちなみに、これにて query 三兄弟のできあがり。
「queryInsert(), queryUpdate(), queryDelete()」
ということで、近いうちに正式リリースしますね。
2011/1/18 しゃってん <schatt...@gmail.com>:
SQLServerの曖昧検索では、正規表現(っぽいこと!?)を利用する
ためのワイルドカード "[" と "]" が存在するのですが、
(というかさっき知ったのですが)
ConditionBean や ParameterBean の LikeSearchOption で
一致の方向が定まった時にエスケープするようにしました。
DBFlute-0.9.8.4-10-SNAPSHOT (以降) にて反映されています。
恐らく Sybase も同じなんじゃないかと思うので対応しましたが、
しゃってんさんの方で確認して頂けないでしょうか?
まあ、DBFlute を Sybase で使っているのは、しゃってんさんだけ
だと踏んでいるので、特に困っていなければ気の向いたときにでも
という感じで。
※SQLServerでは確認が取れているので、Sybaseでの確認が
遅れてもリリース時期が来たらリリースしちゃいます。
2011/1/18 kubo <dbf...@gmail.com>:
Sybaseでの確認ありがとう。
なんともすごい結果で...
独自のエスケープ文字っていうか、
エスケープ方法自体が独自っての、
ちょっと許せない感じだよねw
とりあえず、動かないんじゃしょうがないので、
Sybaseでの [ と ] のエスケープ処理は外します。
WayOfSybaseクラスで getOriginalWildCardList()
を空っぽにすればいいだけなのだ。
次のバージョンでは、結局 Sybase の [ と ] に関しては、
「DBFluteとしては何もしない」というもともとの挙動に
戻ります。
2011/6/15 しゃってん <schatt...@gmail.com>:
おおぅ、しゃってんさん、ありがとう。
全角に関しては、最新では
「全角にエスケープが必要なDBMSだけエスケープ」
という仕様になっているので、回避できているはずです。
正規表現のコンパイルエラーはちょっとアプローチできないね。
っていうか、正規表現のエスケープ自体もアプローチしてないので、
Sybaseはそんな感じで...
※SQLServerはどうなっちゃうんだろうなぁ....
2011/7/8 しゃってん <schatt...@gmail.com>:
select * from ( select plain.*, ROW_NUMBER() over (order by ... ,plain.c10desc) as rn from ( select ... ,dfloc.UPDATE_DATETIMEas c10 fromMEMBER dflocwhere ... order by... ,dfloc.UPDATE_DATETIME desc) plain ) ext where ext.rn > 80 and ext.rn <= 100
しゃってんさん、ありがとう!
そうなんだよね、そのROW_NUMBER()の方式、
他のDBMSでも若干見かけるのだけどOrderByの同期がつらいんだよね。
なんで、こんなへんてこりんな仕様になっちゃうんだろう...
とにもかくにも貴重な情報ありがとう。、
2011/10/17 しゃってん <schatt...@gmail.com>:
> --
> このメールは Google グループのグループ「DBFluteユーザの集い」の登録者に送られています。
> このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/dbflute/-/dXM--fSeFkMJ
> にアクセスしてください。