質問編集履歴

2

当初質問から一歩進んだため、その旨修正

2019/01/21 02:34

投稿

inu_inu
inu_inu

スコア19

test CHANGED
@@ -1 +1 @@
1
- copyManager利用してpsqlコマンドを実行したい
1
+ テーブルデータCSV出力しても中身が空になる
test CHANGED
@@ -1,4 +1,8 @@
1
1
  java初心者です、不備があったらご指摘ください。
2
+
3
+ ※当初質問文から、一歩進んだため、ソースを修正しています。
4
+
5
+ (当初質問:copyManagerを利用してpsqlコマンドを実行したい)
2
6
 
3
7
 
4
8
 
@@ -14,15 +18,13 @@
14
18
 
15
19
  PostgreSQLからデータを出力する際は、下記のようなCOPYコマンドを利用したいと思っています。
16
20
 
17
- (下記コマンドを\copyとして、psqlにて実施したところ想定通り出力できました)
21
+
18
22
 
19
23
 
20
24
 
21
25
  ```java
22
26
 
23
- COPY テーブル名 TO '/パス/ファイル名.tsv' WITH (FORMAT csv ,HEADER
24
-
25
- ,NULL 'null' ,DELIMITER E'\t');
27
+ COPY driver_message TO STDOUT WITH (FORMAT csv ,HEADER ,NULL 'null' ,DELIMITER E'\t');
26
28
 
27
29
 
28
30
 
@@ -30,15 +32,15 @@
30
32
 
31
33
 
32
34
 
33
- 上記コマンドをjava上で実行するためには、copyManagerを使うことで実行できると見つけて実装していますが、Exceptionが発生して実現るこできません。
35
+ 上記コマンドをjava上で実行するためには、copyManagerを使うことで実行できると見つけて実装していますが、実行してもファイルを出力しまがファイルの中身が空なり正しく出力できません。
34
36
 
35
- copyManagerの使い方が違う・そもそも使えないなどご指摘ありましたら頂けると幸いです。
37
+ copyManagerの使い方が違う・コマンドがおかしなどご指摘ありましたら頂けると幸いです。
36
38
 
37
39
 
38
40
 
39
41
  ```java
40
42
 
41
- public class OutputDb {
43
+ public class OutputDbDao {
42
44
 
43
45
 
44
46
 
@@ -60,9 +62,9 @@
60
62
 
61
63
 
62
64
 
63
- System.out.println("OutputDao実行");
65
+ System.out.println("OutputDao 開始");
64
66
 
65
-
67
+
66
68
 
67
69
  // PostgreSQLへ接続
68
70
 
@@ -70,13 +72,15 @@
70
72
 
71
73
 
72
74
 
75
+
76
+
73
77
  // 接続情報取得
74
78
 
75
- String jdbcUrl = "jdbc:postgresql://xxx.xxx.xxx.xxx:5432/abc_def";
79
+ String jdbcUrl = "jdbc:postgresql://xxx.xxx.xxx.xxx:5432/abc_cde";
76
80
 
77
- String DbUser = "xxx";
81
+ String DbUser = "user";
78
82
 
79
- String DbPassword = "xxx";
83
+ String DbPassword = "pass";
80
84
 
81
85
 
82
86
 
@@ -86,48 +90,36 @@
86
90
 
87
91
 
88
92
 
89
- // PostgreSQLコマンド呼び出し実行
93
+ // PostgreSQLコマンド実行クラス
90
94
 
91
- String command = "COPY テーブル名 TO '/パス/ファイル名.tsv' WITH (FORMAT csv ,HEADER ,NULL 'null' ,DELIMITER E'\t');";
95
+ // copyManager準備
92
96
 
93
-
94
-
95
- // PostgreSQLコマンド実行クラス
97
+ FileOutputStream file = new FileOutputStream("/tmp/table.tsv");
96
98
 
97
99
  CopyManager copyManager = new CopyManager((BaseConnection) conn);
98
100
 
99
-
101
+ Writer writer = new OutputStreamWriter(file, "UTF8");
100
102
 
101
- // PostgreSQLコマンド実行
103
+
102
104
 
105
+ // PostgreSQLコマンド呼び出し実行
106
+
107
+ String command = "COPY driver_message TO STDOUT WITH (FORMAT csv ,HEADER ,NULL 'null' ,DELIMITER E'\t');";
108
+
109
+
110
+
111
+ // PostgreSQLコマンド実行
112
+
103
- copyManager.copyOut(command);
113
+ copyManager.copyOut(command,writer);
114
+
115
+
116
+
117
+ System.out.println("OutputDao 完了");
118
+
119
+
104
120
 
105
121
  }
106
122
 
107
123
  }
108
124
 
109
125
  ```
110
-
111
- ```exception
112
-
113
- org.postgresql.util.PSQLException: ERROR: ファイル経由のCOPY FROM、COPY TOを行うにはスーパーユーザでなければなりません
114
-
115
- ヒント: 標準入出力経由のCOPYは誰でも実行可能です。またpsqlの\copyも誰でも実行できます
116
-
117
- at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2433)
118
-
119
- at org.postgresql.core.v3.QueryExecutorImpl.processCopyResults(QueryExecutorImpl.java:1114)
120
-
121
- at org.postgresql.core.v3.QueryExecutorImpl.startCopy(QueryExecutorImpl.java:840)
122
-
123
- at org.postgresql.copy.CopyManager.copyOut(CopyManager.java:59)
124
-
125
- at パッケージ.OutputDbDao.exportTsv(OutputDbDao.java:83)
126
-
127
- at パッケージ.OutputDb.main(OutputDb.java:29)
128
-
129
-
130
-
131
- ```
132
-
133
- ※設定しているユーザはスーパーユーザです。psqlでの実行は問題なくできました。

1

Exceptionの内容を追加

2019/01/21 02:34

投稿

inu_inu
inu_inu

スコア19

test CHANGED
File without changes
test CHANGED
@@ -30,7 +30,7 @@
30
30
 
31
31
 
32
32
 
33
- 上記コマンドをjava上で実行するためには、copyManagerを使うことで実行できると見つけて実装していますが、実現することができません。。
33
+ 上記コマンドをjava上で実行するためには、copyManagerを使うことで実行できると見つけて実装していますが、Exceptionが発生して実現することができません。。
34
34
 
35
35
  copyManagerの使い方が違う・そもそも使えないなど、ご指摘ありましたら頂けると幸いです。
36
36
 
@@ -107,3 +107,27 @@
107
107
  }
108
108
 
109
109
  ```
110
+
111
+ ```exception
112
+
113
+ org.postgresql.util.PSQLException: ERROR: ファイル経由のCOPY FROM、COPY TOを行うにはスーパーユーザでなければなりません
114
+
115
+ ヒント: 標準入出力経由のCOPYは誰でも実行可能です。またpsqlの\copyも誰でも実行できます
116
+
117
+ at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2433)
118
+
119
+ at org.postgresql.core.v3.QueryExecutorImpl.processCopyResults(QueryExecutorImpl.java:1114)
120
+
121
+ at org.postgresql.core.v3.QueryExecutorImpl.startCopy(QueryExecutorImpl.java:840)
122
+
123
+ at org.postgresql.copy.CopyManager.copyOut(CopyManager.java:59)
124
+
125
+ at パッケージ.OutputDbDao.exportTsv(OutputDbDao.java:83)
126
+
127
+ at パッケージ.OutputDb.main(OutputDb.java:29)
128
+
129
+
130
+
131
+ ```
132
+
133
+ ※設定しているユーザはスーパーユーザです。psqlでの実行は問題なくできました。