🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

2回答

4433閲覧

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

picohead

総合スコア8

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2019/12/01 07:11

前提・実現したいこと

プレーン(意図→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)

該当のソースコード

Kotlin

1import java.sql.Connection; 2import java.sql.DriverManager; 3import java.sql.ResultSet; 4import java.sql.SQLException; 5import java.sql.Statement; 6 7fun main(args:Array<String>) { 8 var conn: Connection? = null; 9 var stmt: Statement? = null; 10 var rset: ResultSet? = null; 11 12 //接続文字列 13 val url: String = "jdbc:postgresql://localhost:5432/postgres"; 14 val user: String = "user"; 15 val password: String = "password"; 16 17 try{ 18 //PostgreSQLへ接続 19 conn = DriverManager.getConnection(url, user, password); //ここでエラー!! 20 21 //自動コミットOFF 22 conn.setAutoCommit(false); 23 24 //SELECT文の実行 25 stmt = conn.createStatement(); 26 val sql: String = "SELECT 1"; 27 rset = stmt.executeQuery(sql); 28 29 //SELECT結果の受け取り 30 while(rset.next()){ 31 val col: String = rset.getString(1); 32 System.out.println(col); 33 } 34 35 //コミット 36 conn.commit(); 37 } 38 catch (e: SQLException){ 39 e.printStackTrace(); 40 } 41 finally { 42 try { 43 rset?.close(); 44 stmt?.close(); 45 conn?.close(); 46 } 47 catch (e: SQLException){ 48 e.printStackTrace(); 49 } 50 51 } 52} 53

試したこと

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(多分)
・プレーン(?)を選択した理由は、初めてのプログラミングでいきなり使うには選択肢が多過ぎて手がつけられないと感じたからです。詳細は割愛しますが、まずは私が理解できる単純なケースから手をつけようと思いました。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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 06:37

storm3

総合スコア330

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

picohead

2019/12/04 13:05

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

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さん、改めてありがとうございました!!

投稿2019/12/07 06:21

picohead

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問