新人エンジニアの三上です。
今回は、Junit のテスト(DB への insert 処理あり)をローカル(PostgreSQL)で実施した場合と、Azure(SQL Server) で build した場合に不一致となり、エラーの原因調査に時間がかかるということがあったので、その原因と解決策を書いていこうと思います。
ORDER BY
SQL の SELECT文に「ORDER BY」句を使用することで、レコードの取得順序を指定することが出来る。
以下のようなレコードを登録している状態で、実際に使用した結果、取得されるレコードを例示する。
sample テーブル
record_no | register_info | register_dt |
---|---|---|
1 | AAA | 2024-08-31 |
2 | BBB | 2024-09-01 |
3 | CCC | 2024-08-30 |
SELECT record_no, register_info, register_dt
FROM sample
ORDER BY register_dt ASC;
上記の Query により取得されるレコードを以下に示す。
取得レコード
record_no | register_info | register_dt |
---|---|---|
3 | CCC | 2024-08-30 |
1 | AAA | 2024-08-31 |
2 | BBB | 2024-09-01 |
重複日付のレコード出力順序
以下のように登録日付が重複しているレコードに対して、「ORDER BY」句を使用するとレコードの取得順序はどうなるか?
sample_duplication
record_no | register_info | register_dt |
---|---|---|
1 | AAA | 2024-08-30 |
2 | BBB | 2024-08-30 |
3 | CCC | 2024-08-30 |
SELECT record_no, register_info, register_dt
FROM sample
ORDER BY register_dt ASC;
結果は、使用環境に依存する。
解決策
解決策として実際に使用したのは、Junit の insert 処理の際に登録日付を同じものにしない。
もう1つ考えられるものとしては、「ORDER BY」句に指定するカラムを追加するというものである。
そうすることで、1つの条件に依存せず、想定通りにレコードを取得することができる。
まとめ
ローカルではテストが成功するが、開発環境で biuld するとエラーを起こすとき、
DBを使用するテストでエラーを起こしている場合、レコードの取得順序を疑ってみて欲しい。