DOBON.NETプログラミング道掲示板

■35701 / 親記事)  DuckdbのJDBCサンプル
  
□投稿者/ duckdb-jdbc-sample 一般人(1回)-(2026/03/13(Fri) 14:12:31)
  • アイコン環境/言語:[Java] 
    分類:[その他] 

    てすと
マルチポストを報告
違反を報告
引用返信 削除キー/
■35702 / ResNo.1)  Re[1]: DuckdbのJDBCサンプル
□投稿者/ Sample 一般人(1回)-(2026/03/13(Fri) 14:16:51)
  • アイコンimport java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.NoSuchElementException;
    import java.util.Scanner;

    public class DuckDBClientSample {

    public static void main(String[] args) throws Exception {

    init();

    System.out.println("DuckDB(duckdb.db)に接続しました。SQLを入力してください:");
    System.out.println("ヘルプを参照する場合は「help」、終了する場合は「exit」もしくは「quit」を入力してください。");

    try {
    @SuppressWarnings("resource")
    Scanner scanner = new Scanner(System.in);
    while (true) {
    System.out.print("> ");
    StringBuilder commandBuilder = new StringBuilder();

    // セミコロンが来るまで読み込み
    while (true) {
    String line;
    try {
    line = scanner.nextLine();
    } catch (NoSuchElementException e) {
    break;
    }

    if (line.trim().equalsIgnoreCase("exit")
    || line.trim().equalsIgnoreCase("quit")) {
    System.out.println("切断しました。");
    System.exit(0);
    }

    if (line.trim().equalsIgnoreCase("help")) {
    usage();
    } else {

    commandBuilder.append(line).append(" ");

    if (line.trim().endsWith(";")) {
    break;
    }
    }
    }

    String command = commandBuilder.toString().trim();
    long start = System.currentTimeMillis();

    if (1 < command.length()) {
    try {
    sendCommand(command); // セミコロン付きのコマンドを送信
    } catch (Exception e) {
    e.printStackTrace();
    }
    long end = System.currentTimeMillis();
    //Thread.sleep(30);
    System.out.println("処理時間 time[ms]=" + (end - start) + " count=" + count);
    }

    }
    } catch (Throwable e) {
    e.printStackTrace();
    System.exit(1);
    } finally {
    if (stmt != null && !stmt.isClosed()) {
    stmt.close();
    }
    if (conn != null && !conn.isClosed()) {
    conn.close();
    }
    }

    }

    private static void usage() {
    System.out.print("> ");
    }

    static Connection conn = null;

    static Statement stmt = null;

    public static void init() {
    try {
    conn = DriverManager.getConnection("jdbc:duckdb:duckdb.db");
    stmt = conn.createStatement();

    //stmt.execute("INSTALL sqlite");
    //stmt.execute("LOAD sqlite");
    //stmt.execute("ATTACH 'sqlite.db' (TYPE sqlite)");
    //stmt.execute("USE sqlite");

    } catch (Exception e) {

    }
    }

    private static long count = 0L;

    private static void sendCommand(String sql) throws Exception {

    try {
    count = 0L;

    if (null == stmt || stmt.isClosed()) {
    stmt = conn.createStatement();
    }

    if (sql.trim().startsWith("COMMIT")) {
    conn.commit();
    conn.setAutoCommit(true);
    System.out.println("commit");
    return;
    }

    if (sql.trim().startsWith("ROLLBACK")) {
    conn.rollback();
    conn.setAutoCommit(true);
    System.out.println("rollback");
    return;
    }

    if (sql.trim().startsWith("BEGIN TRANSACTION")) {
    conn.setAutoCommit(false);
    System.out.println("begin transaction");
    return;
    }

    if (sql.startsWith("FROM") || sql.startsWith("from")) {
    sql = "SELECT * " + sql;
    }

    if (sql.startsWith("DIFF") || sql.startsWith("diff")) {
    sql = "SELECT * FROM " + sql.split(" ")[1]
    + " EXCEPT"
    + " SELECT * FROM " + sql.split(" ")[2].replaceAll(";", "")
    + " UNION ALL"
    + " SELECT * FROM " + sql.split(" ")[2].replaceAll(";", "")
    + " EXCEPT"
    + " SELECT * FROM " + sql.split(" ")[1]
    + (sql.endsWith(";") ? "" : ";");
    }

    if (sql.startsWith("EXPLAIN") || sql.startsWith("explain")
    || sql.startsWith("SHOW") || sql.startsWith("show")
    || sql.startsWith("SELECT") || sql.startsWith("select")) {

    ResultSet rs = stmt.executeQuery(sql);

    int colsize = rs.getMetaData().getColumnCount();
    List<String> header = new ArrayList<>();
    for (int i = 1; i <= colsize; i++) {
    header.add(rs.getMetaData().getColumnName(i));
    }
    System.out.println("[debug]SQL=" + sql);
    System.out.println("" + String.join(",", header));

    StringBuilder sb = new StringBuilder(4096);
    String value = null;

    while (rs.next()) {
    count++;
    List<String> row = new ArrayList<>();
    for (int i = 0; i < colsize; i++) {
    value = rs.getString(i + 1);
    if (null == value) {
    row.add("");
    } else {
    row.add("\"" + value + "\"");
    }
    }
    sb.append(String.join(",", row));
    sb.append("\n");
    }
    if (colsize == 0) {
    System.out.println("__NO_HIT__ sql=" + sql);
    } else {
    System.out.print(sb.toString());
    }
    } else if (sql.startsWith("INSERT") || sql.startsWith("insert")) {
    count = stmt.executeUpdate(sql);
    //System.out.println("result=" + result + " sql=" + sql);
    } else if (sql.startsWith("UPDATE") || sql.startsWith("update")) {
    count = stmt.executeUpdate(sql);
    //System.out.println("result=" + result + " sql=" + sql);
    } else if (sql.startsWith("DELETE") || sql.startsWith("delete")) {
    count = stmt.executeUpdate(sql);
    //System.out.println("result=" + result + " sql=" + sql);
    } else {
    boolean result = stmt.execute(sql);
    System.out.println("result=" + result + " sql=" + sql);
    }
    } catch (SQLException e) {
    e.printStackTrace();
    //throw e;
    }
    }
    }
違反を報告
引用返信 削除キー/



スレッド内ページ移動 / << 0 >>

このスレッドに書きこむ

Mode/  Pass/


- Child Tree -