java使用copy in 的方式把資料匯入postgres或greenplum
阿新 • • 發佈:2019-01-29
copy in
postgres匯入資料的時候可以使用cpoy 命令進行資料匯入,如果使用java操作copy命令則需要使用postgres提供的jdbc驅動中的CopyManager來實現
- 封裝一下
public class PGCopyInUtils {
/**
* 將表中的資料匯出到本地檔案
*
* @param connection 連線
* @param filePath 檔案路徑
* @param tableOrQuery 表名 或者查詢語句
* @throws SQLException SQLException
* @throws IOException IOException
*/
public static void copyToFile(Connection connection, String filePath, String tableOrQuery)
throws SQLException, IOException {
FileOutputStream fileOutputStream = null;
try {
CopyManager copyManager = new CopyManager((BaseConnection) connection);
fileOutputStream = new FileOutputStream(filePath);
String copyOut = "COPY " + tableOrQuery + " TO STDOUT DELIMITER AS ','";
final long line = copyManager.copyOut(copyOut, fileOutputStream);
System.out.println(line);
} finally {
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 將檔案中的資料匯入到資料庫中
*
* @param connection 連線
* @param filePath 檔案路徑
* @param tableName 表名
* @throws SQLException SQLException
* @throws IOException IOException
* @return long 匯入的行數
*/
public static long copyFromFile(Connection connection, String filePath, String tableName)
throws SQLException, IOException {
FileInputStream fileInputStream = null;
try {
CopyManager copyManager = new CopyManager((BaseConnection) connection);
fileInputStream = new FileInputStream(filePath);
String copyIn = "COPY " + tableName + " FROM STDIN DELIMITER AS ','";
return copyManager.copyIn(copyIn, fileInputStream);
} finally {
if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
- 使用
1. connection 資料庫連線
2. 檔案路徑
3. 表名
PGCopyInUtils.copyFromFile(connection, Constants.COPY_DEVICE_DATA_FILE_PATH, Constants.TABLE_NAME);
- 注意
以上檔案內容的分隔符為"," 標準輸入.