質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

1992閲覧

テーブルデータをCSV出力しても中身が空になる

inu_inu

総合スコア19

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2019/01/21 00:14

編集2019/01/21 02:34

java初心者です、不備があったらご指摘ください。
※当初質問文から、一歩進んだため、ソースを修正しています。
(当初質問:copyManagerを利用してpsqlコマンドを実行したい)

前提・実現したいこと

テーブルの全データをCSVに出力したいです。
javaを使ってPostgreSQLにアクセスしようと思っています。

PostgreSQLからデータを出力する際は、下記のようなCOPYコマンドを利用したいと思っています。

java

1COPY driver_message TO STDOUT WITH (FORMAT csv ,HEADER ,NULL 'null' ,DELIMITER E'\t'); 2

上記コマンドをjava上で実行するためには、copyManagerを使うことで実行できると見つけて実装していますが、実行してもファイルを出力しますがファイルの中身が空となり正しく出力できません。
copyManagerの使い方が違う・コマンドがおかしい、などご指摘ありましたら頂けると幸いです。

java

1public class OutputDbDao { 2 3 /** 4 * TSV出力処理 5 * 6 * @throws SQLException 7 * @throws ClassNotFoundException 8 * @throws IOException 9 */ 10 public void exportTsv() throws SQLException, ClassNotFoundException, IOException { 11 12 System.out.println("OutputDao 開始"); 13 14 // PostgreSQLへ接続 15 Class.forName("org.postgresql.Driver"); 16 17 18 // 接続情報取得 19 String jdbcUrl = "jdbc:postgresql://xxx.xxx.xxx.xxx:5432/abc_cde"; 20 String DbUser = "user"; 21 String DbPassword = "pass"; 22 23 Connection conn = null; 24 conn = DriverManager.getConnection(jdbcUrl, DbUser, DbPassword); 25 26 // PostgreSQLコマンド実行クラス 27 // copyManager準備 28 FileOutputStream file = new FileOutputStream("/tmp/table.tsv"); 29 CopyManager copyManager = new CopyManager((BaseConnection) conn); 30 Writer writer = new OutputStreamWriter(file, "UTF8"); 31 32 // PostgreSQLコマンド呼び出し実行 33 String command = "COPY driver_message TO STDOUT WITH (FORMAT csv ,HEADER ,NULL 'null' ,DELIMITER E'\t');"; 34 35 // PostgreSQLコマンド実行 36 copyManager.copyOut(command,writer); 37 38 System.out.println("OutputDao 完了"); 39 40 } 41}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2019/01/22 17:37

exportTsv メソッドでは例外の処理が何もありませんが, 呼び出し側で表示する等で, 例外が発生していないことは確認されていますでしょうか.
inu_inu

2019/01/23 00:10

呼び出し側でtry-catchをしておりますが、例外の発生はありませんでした。 記述不足です、申し訳ございません。
guest

回答1

0

ベストアンサー

copyOut の後に writer.close(); ではどうなりますか?

投稿2019/01/23 02:45

jimbe

総合スコア12646

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

inu_inu

2019/01/23 03:03

ご指摘の通り、writer.close();をcopyOutの後につけたら出力できました! writerをcloseしていない場合、書き込みの処理が完了せず反映されないということでしょうか。 大変勉強になりました、ありがとうございます!
jimbe

2019/01/23 03:35 編集

java に限らず ファイル入出力や通信等 連続するデータ(stream) を扱う場合, (処理の関係上や効率化, スピードアップ等のために)内部にバッファを持っている場合が多いです. その場合, 処理途中のデータがバッファに残ることがあります. java では java.io.Flushable というインターフェースがありまして, これを実装しているクラスは, flush() を実装してそのバッファの中身を全て書き出すという動作が定義されます. 逆に言うと, java.io.Flushable を実装しているクラスは内部にバッファを持っているので, flash() を呼ばないとデータが出て行かないことがあるということです. また, そういうクラスの場合は close() でも内部で flash() を呼び出していますので, flash()→close() と書かなくても close() だけでフラッシュされます. 理由は上記のようになりますが, 詳細はともかく, 「openしたら (例外はありますが new した時点で open されます) close する」という原則でコードを書くようにしますと, 今後も同様の問題にあうことは少なくなると思います.
inu_inu

2019/01/23 04:03

根幹のご提示・ご教授ありがとうございます、大変わかりやすかったです。 「openしたら (例外はありますが new した時点で open されます) close する」 の原則を念頭に入れて、今後も勉強などさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問