質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.93%

プレーンなKotlinでPostgreSQLに接続したい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,469

score 8

前提・実現したいこと

プレーン(意図→SpringBootやIntellijを使わずにテキストエディタでktファイルを書いてkotlinc-jvm.batでコンパイルし、コマンドプロンプトで実行)なKotlinで、PotgreSQLに接続し、とりあえずselect文を実行し、結果を取得したい。

発生している問題・エラーメッセージ

コマンドプロンプト上で下記を実行すると、

kotlinc-jvm.bat -cp "~\postgresql-42.2.5.jar" -include-runtime -d postgre.jar postgre.kt
java -jar postgre.jar


以下のエラーが出ます。

java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost:5432/postgres
        at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:702)
        at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:228)
        at PostgreKt.main(postgre.kt:19)

該当のソースコード

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

fun main(args:Array<String>) {
    var conn: Connection? = null;
    var stmt: Statement? = null;
    var rset: ResultSet? = null;

    //接続文字列
    val url: String = "jdbc:postgresql://localhost:5432/postgres";
    val user: String = "user";
    val password: String = "password";

    try{
        //PostgreSQLへ接続
        conn = DriverManager.getConnection(url, user, password); //ここでエラー!!

        //自動コミットOFF
        conn.setAutoCommit(false);

        //SELECT文の実行
        stmt = conn.createStatement();
        val sql: String = "SELECT 1";
        rset = stmt.executeQuery(sql);

        //SELECT結果の受け取り
        while(rset.next()){
            val col: String = rset.getString(1);
            System.out.println(col);
        }

        //コミット
        conn.commit();
    }
    catch (e: SQLException){
        e.printStackTrace();
    }
    finally {
        try {
            rset?.close();
            stmt?.close();
            conn?.close();
        }
        catch (e: SQLException){
            e.printStackTrace();
        }

    }
}

試したこと

https://teratail.com/questions/184755
上記URLにて、JRE8以降向けのドライバと記載があったので、下記の2つも試しましたが、同様のエラーでした。
postgresql-42.2.5.jre6.jar
postgresql-42.2.5.jre7.jar

また、よくある対処法にClass.forNameがあるようなので
getConnectionの直前に下記を追記した場合、
Class.forName("com.postgresql.jdbc.Driver");
下記のエラーが出ました。
Exception in thread "main" java.lang.ClassNotFoundException: com.postgresql.jdbc.Driver

補足情報(FW/ツールのバージョンなど)

・jarファイルのパスやpasswordなどは変更しています。
・Windows10 pro 64bit
・PostgreSQL12
・kotlincは1.3.60(多分)
・プレーン(?)を選択した理由は、初めてのプログラミングでいきなり使うには選択肢が多過ぎて手がつけられないと感じたからです。詳細は割愛しますが、まずは私が理解できる単純なケースから手をつけようと思いました。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

Kotlinは詳しくないので、KotlinというよりはJavaの観点でのやり方になります。

postgresql-42.2.5.jarのクラスパスが通っていないのは、jarオプションでの使い方が違っているだけだと思われます。

Javaコマンドにはjar作成時に外部jarも一緒に取り込むコマンドはありません。
なのでMavenなどのビルドツールを使って実現させていることがほとんどです。
Mavenだとmaven-assembly-pluginですね。
(Webアプリの場合は、Tomcatのlibフォルダに外部jarを配置してTomcat起動時にパスを通すなどの方法も昔はやってましたね)

また、jarオプションを使うとcpオプションは無視されます。
(https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html)
外部jarと自作jarを一緒のパスに含めてた以下のやり方なら動作が確認できました。

kotlinc-jvm.bat -include-runtime -d postgre.jar postgre.kt
java -cp ./postgre.jar;./lib/postgresql-42.2.8.jar PostgreKt

使ったもの
kotlin-compiler-1.3.60
postgresql-42.2.8.jar
Windows10
java 1.8

ちなみに、kotlinは詳しくないので、ビルドしてできたクラスファイル名がPostgreKt.classになった理由はわかりませんので悪しからず。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/04 22:05

    ご回答ありがとうございます。
    パスを自分の環境用に変更して実行したところ、以下のエラーとなりました。
    一歩進めたようなので一旦、自分で進めてみます!
    '''
    org.postgresql.util.PSQLException: localhost:5432 への接続が拒絶されました。ホスト名とポート番号が正しいことと、postmaster がTCP/IP接続を受け付けていることを確認してください。
    '''

    キャンセル

check解決した方法

0

https://improve-future.com/configure-postgresql-to-accessible-from-remote.html

上記URLを参考に、
「~\PostgreSQL\12\data」フォルダの
pg_hba.conf
postgresql.conf
に必要な情報を入力。

「Windows管理ツール」の「サービス」で
「potgresql-x64-12 - PostgreSQL Server 12」を
再起動したら無事にコマンドプロンプト上に"1"が出力されました。

回答して頂いたstorm3さん、改めてありがとうございました!!

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る