質問編集履歴
2
当初質問から一歩進んだため、その旨修正
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
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
|
-
|
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を使うことで実行できると見つけて実装していますが、
|
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_de
|
79
|
+
String jdbcUrl = "jdbc:postgresql://xxx.xxx.xxx.xxx:5432/abc_cde";
|
76
80
|
|
77
|
-
String DbUser = "
|
81
|
+
String DbUser = "user";
|
78
82
|
|
79
|
-
String DbPassword = "
|
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
|
-
|
95
|
+
// copyManager準備
|
92
96
|
|
93
|
-
|
94
|
-
|
95
|
-
|
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
|
-
|
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の内容を追加
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での実行は問題なくできました。
|