PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Bản sao CSV vào Postgres với mảng loại tùy chỉnh sử dụng JDBC

Xem https://git.mikael.io/mikaelhg/pg -object-csv-copy-poc / cho một dự án có thử nghiệm JUnit thực hiện những gì bạn muốn.

Về cơ bản, bạn muốn có thể sử dụng dấu phẩy cho hai việc:để phân tách các mục mảng và để phân tách các trường loại, nhưng bạn KHÔNG muốn phân tích cú pháp CSV diễn giải dấu phẩy là bộ phân định trường.

Vì vậy,

  1. bạn muốn yêu cầu trình phân tích cú pháp CSV coi toàn bộ hàng là một chuỗi, một trường, bạn có thể thực hiện điều này bằng cách đặt nó trong dấu ngoặc kép và nói với trình phân tích cú pháp CSV về điều này và
  2. bạn muốn trình phân tích cú pháp trường PG coi mỗi trường hợp loại mục mảng được đặt trong một dấu ngoặc kép.

Mã:

copyManager.copyIn("COPY my_table (addresses) FROM STDIN WITH CSV QUOTE ''''", reader);

DML ví dụ 1:

COPY my_table (addresses) FROM STDIN WITH CSV QUOTE ''''

CSV ví dụ 1:

'{"(10.0.0.1,1)","(10.0.0.2,2)"}'
'{"(10.10.10.1,80)","(10.10.10.2,443)"}'
'{"(10.10.10.3,8080)","(10.10.10.4,4040)"}'

DML ví dụ 2, thoát khỏi dấu ngoặc kép:

COPY my_table (addresses) FROM STDIN WITH CSV

CSV ví dụ 2, thoát khỏi dấu ngoặc kép:

"{""(10.0.0.1,1)"",""(10.0.0.2,2)""}"
"{""(10.10.10.1,80)"",""(10.10.10.2,443)""}"
"{""(10.10.10.3,8080)"",""(10.10.10.4,4040)""}"

Toàn bộ lớp kiểm tra JUnit:

package io.mikael.poc;

import com.google.common.io.CharStreams;
import org.junit.*;
import org.postgresql.PGConnection;
import org.postgresql.copy.CopyManager;
import org.testcontainers.containers.PostgreSQLContainer;

import java.io.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;

import static java.nio.charset.StandardCharsets.UTF_8;

public class CopyTest {

    private Reader reader;

    private Connection connection;

    private CopyManager copyManager;

    private static final String CREATE_TYPE = "CREATE TYPE address AS (ip inet, port int)";

    private static final String CREATE_TABLE = "CREATE TABLE my_table (addresses  address[] NULL)";

    private String loadCsvFromFile(final String fileName) throws IOException {
        try (InputStream is = getClass().getResourceAsStream(fileName)) {
            return CharStreams.toString(new InputStreamReader(is, UTF_8));
        }
    }

    @ClassRule
    public static PostgreSQLContainer db = new PostgreSQLContainer("postgres:10-alpine");

    @BeforeClass
    public static void beforeClass() throws Exception {
        Class.forName("org.postgresql.Driver");
    }

    @Before
    public void before() throws Exception {
        String input = loadCsvFromFile("/data_01.csv");
        reader = new StringReader(input);

        connection = DriverManager.getConnection(db.getJdbcUrl(), db.getUsername(), db.getPassword());
        copyManager = connection.unwrap(PGConnection.class).getCopyAPI();

        connection.setAutoCommit(false);
        connection.beginRequest();

        connection.prepareCall(CREATE_TYPE).execute();
        connection.prepareCall(CREATE_TABLE).execute();
    }

    @After
    public void after() throws Exception {
        connection.rollback();
    }

    @Test
    public void copyTest01() throws Exception {
        copyManager.copyIn("COPY my_table (addresses) FROM STDIN WITH CSV QUOTE ''''", reader);

        final StringWriter writer = new StringWriter();
        copyManager.copyOut("COPY my_table TO STDOUT WITH CSV", writer);
        System.out.printf("roundtrip:%n%s%n", writer.toString());

        final ResultSet rs = connection.prepareStatement(
                "SELECT array_to_json(array_agg(t)) FROM (SELECT addresses FROM my_table) t")
                .executeQuery();
        rs.next();
        System.out.printf("json:%n%s%n", rs.getString(1));
    }

}

Đầu ra kiểm tra:

roundtrip:
"{""(10.0.0.1,1)"",""(10.0.0.2,2)""}"
"{""(10.10.10.1,80)"",""(10.10.10.2,443)""}"
"{""(10.10.10.3,8080)"",""(10.10.10.4,4040)""}"

json:
[{"addresses":[{"ip":"10.0.0.1","port":1},{"ip":"10.0.0.2","port":2}]},{"addresses":[{"ip":"10.10.10.1","port":80},{"ip":"10.10.10.2","port":443}]},{"addresses":[{"ip":"10.10.10.3","port":8080},{"ip":"10.10.10.4","port":4040}]}]


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chọn hàng ngẫu nhiên từ bảng PostgreSQL với xác suất hàng có trọng số

  2. finder_sql không phân tích cú pháp chuỗi với Rails

  3. Tìm phạm vi ngày trùng lặp trong PostgreSQL

  4. Xử lý ngoại lệ PostgreSQL

  5. Tìm n Hàng xóm Gần nhất cho Điểm đã cho bằng PostGIS?