Spring JDBCでは、あらかじめ準備したSQL文をアプリケーション起動時に実行することができます。
この記事では、下記の書籍で勉強中に私が躓いた「schema.sqlに書いたcreate文が実行されない」問題についての解決方法をご紹介します。
『プロになるJava―仕事で必要なプログラミングの知識がゼロから身につく最高の指南書』
私の環境が悪いのか、この本に書かれた通りにやってもテーブルが作成されませんでした。なのでググってみたのですが、それでもなかなか解決方法にたどり着けなかったので自分への備忘録も兼ねてここに書き残しておこうと思います。
schema.sqlとは
そもそもですがschema.sqlとは何かについて簡単にご説明します。
プロジェクトの「/src/main/resources」の直下に「schema.sql」という名前のファイルを作成してSQL文を記述するとアプリケーション起動時に実行してくれるというものです。
「schema.sql」の他に「data.sql」があり、二つの使い分けは下記のようになります。
「schema.sql」には DDL(Data Definition Language: データ定義言語)テーブル作成などのSQL文を書く。
「data.sql」にはDML(Data Manipulation Language: データ操作言語)レコード追加などのSQL文を書く。
今回は「アプリケーション実行時に対象のテーブルが存在しない場合はテーブルを作成する」ことが目的なので、「schema.sql」を使用します。また、実行するCREATE文はテーブルが存在しない場合のみ実行されるようになっています。具体的な内容は次項目をご覧ください。
上手くいかなかった設定
この書籍に記載されている必要な設定は下記の通りです。
【pom.xml】
<dependency> <groupId>org.springframework.boot<groupId> <artifactId>spring-boot-starter-jdbc<artifactId> </dependency>
【application.properties】
spring.datasource.initialization-mode=always
【schema.sql】
CREATE TABLE IF NOT EXISTS tasklist ( id VARCHAR(8) PRIMARY KEY, task VARCHAR(256), deadline VARCHAR(10), done BOOLEAN );
残念ながらこれらの設定では、テーブルが存在しない状態でアプリケーションを起動すると下記のようにエラーになります。
解決した方法はこれ
前述の設定に加えて下記の設定を追加したところアプリケーション起動時にテーブルが存在しなければ自動的に作成されるようになりました。
【application.properties】
spring.sql.init.mode=always
解決方法は下記のサイトに載っていましたので、興味のある方はご参考ください。
公式サイトより
さいごに
書籍通りに動かすというのも案外難しいものだと感じました。全く同じ環境設定にしているはずなのに上手くいかないという事もありますよね。
ググってみても思ったような解決方法がなかなか見つからない事もあると思います。そういう方の参考になれば嬉しいです。
コメント
どーもとさん
同じ状態となりましたが、この情報で解決できました。
ありがとうございました!!
同じところで躓いておりました!
大変参考になりましたし、公式から探す必要性も教わりました!
ありがとうございます!