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

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

新規登録して質問してみよう
ただいま回答率
85.48%
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

PostgreSQL

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

2492閲覧

Lambda(java)からRDS(PostgreSQL)にINSERTできない

zvub1123

総合スコア230

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

PostgreSQL

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2018/07/25 00:33

編集2018/07/26 02:00

開発環境

AWS Lambda ランタイム:Java8
aws-lambda-java-core :1.2.0.jar
eclipse version    :Oxygen.3a Release (4.7.3a)
PostgreSQL      :42.2.4.jar
SRE System Library  :JavaSE-1.8

やりたいこと

Lambda 上でjavaを動かし、S3からのイベントを検知してRDS(Postgre)にINSERTしたい

現状

INSERT 用のメソッドがエラーにならず実行されることは確認できたのですが、以下のように、全てNULLの行が挿入されてしまいます。

●テストデータ

json

1{ 2 "name": "Chris", 3 "pass": "XmasParty", 4 "age": 20 5}

●ソース

java

1public class InsertRecord implements RequestHandler<Request, Response>{ 2 // 省略:DB接続部分 3 public Response handleRequest(Request request, Context context) { 4 Response response = new Response(); 5 try { 6 System.out.println(request); 7 8 String sql = "INSERT INTO test(name, pass, age) values(" + request.getName() + ", " + request.getPass() + ", " + request.getAge() + ")"; 9 10 conn = DriverManager.getConnection(url, user, pass); 11 Statement stmt = conn.createStatement(); 12 13 int result = stmt.executeUpdate(sql); 14 15 ResultSet resultSet = stmt.executeQuery("SELECT * FROM test WHERE name = " + request.getName()); 16 17 // フィールド一覧を取得 18 List<String> fields = new ArrayList<String>(); 19 ResultSetMetaData rsmd = resultSet.getMetaData(); 20 for (int i = 1; i <= rsmd.getColumnCount(); i++) { 21 fields.add(rsmd.getColumnName(i)); 22 } 23 24 //結果の出力 25 int rowCount = 0; 26 while (resultSet.next()) { 27 rowCount++; 28 29 System.out.println("---------------------------------------------------"); 30 System.out.println("--- Rows:" + rowCount); 31 System.out.println("---------------------------------------------------"); 32 33 //値は、「resultSet.getString(<フィールド名>)」で取得する。 34 for (String field : fields) { 35 response.setFields(field, resultSet.getString(field)); 36 } 37 } 38 39 stmt.close(); 40 conn.close(); 41 42 } catch(SQLException e) { 43 e.printStackTrace(); 44 } 45 return response; 46 } 47} 48

上記のコードは各種Webページを参考にさせていただきながら記述したのですが、
結果は次のようなエラーとなります。

Java

1START RequestId: 59f2199d-9072-11e8-8a69-5b2ce4631401 Version: $LATEST 2lambda.Request@1f28c152 3org.postgresql.util.PSQLException: ERROR: column "chris" does not exist 4 Position: 42 5 at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2103) 6 at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1836) 7 at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257) 8 at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512) 9 at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:374) 10 at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:302) 11 at lambda.InsertRecord.handleRequest(InsertRecord.java:66) 12 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 13 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 14 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 15 at java.lang.reflect.Method.invoke(Method.java:498) 16 at lambdainternal.EventHandlerLoader$PojoMethodRequestHandler.handleRequest(EventHandlerLoader.java:259) 17 at lambdainternal.EventHandlerLoader$PojoHandlerAsStreamHandler.handleRequest(EventHandlerLoader.java:178) 18 at lambdainternal.EventHandlerLoader$2.call(EventHandlerLoader.java:888) 19 at lambdainternal.AWSLambda.startRuntime(AWSLambda.java:283) 20 at lambdainternal.AWSLambda.<clinit>(AWSLambda.java:64) 21 at java.lang.Class.forName0(Native Method) 22 at java.lang.Class.forName(Class.java:348) 23 at lambdainternal.LambdaRTEntry.main(LambdaRTEntry.java:94) 24END RequestId: 59f2199d-9072-11e8-8a69-5b2ce4631401 25REPORT RequestId: 59f2199d-9072-11e8-8a69-5b2ce4631401 Duration: 864.50 ms Billed Duration: 900 ms Memory Size: 512 MB Max Memory Used: 49 MB

上記のエラーの解決方法をご教示いただけますでしょうか。
また、オリジナルのPOJOクラスは以下となりますが、InsertRecordクラスの中に含まなければならない、などの制約はあるのでしょうか。

java

1public class Request { 2 String name; 3 String pass; 4 int age; 5 6 public String getName() { 7 return name; 8 } 9 public String getPass() { 10 return pass; 11 } 12 public String getAge() { 13 return String.valueOf(age); 14 } 15 16 public void setName(String name) { 17 this.name = name; 18 } 19 public void setPass(String pass) { 20 this.pass = pass; 21 } 22 public void setAge(String age) { 23 this.age = Integer.parseInt(age); 24 } 25 26 public Request(String name, String pass, String age) { 27 this.name = name; 28 this.pass = pass; 29 this.age = Integer.parseInt(age); 30 } 31 public Request() { 32 } 33} 34

以上です。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました。

java

1String sql = "INSERT INTO test(name, pass, age) values(" + request.getName() + ", " + request.getPass() + ", " + request.getAge() + ")";

の部分で、 column does not exist が出ていたので、値が列名として認識されているエラーだと思い色々試していましたが、結局はクォートの問題でした。
(POJOクラスでString型として保持していても、sql文を構成する箇所ではしっかりクォートしてあげないといけないみたいですね。。。)

修正後は以下。

java

1String sql = "INSERT INTO test(name, pass, age) values( '" + request.getName() + "', '" + request.getPass() + "', " + request.getAge() + ")";

分かりづらいですが、name, pass にあたる部分をシングルクォート(' ')で囲んでいます。

投稿2018/07/26 05:19

zvub1123

総合スコア230

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問