SQLite

手軽に利用できる関係データベースシステムの一つです。 データベースの内容を一つのファイルとして扱うため、組み込み用途に優れています。

特に、管理者権限を持たないレンタルサーバ等の環境では、 MySQLやPostgreSQL等を自分でインストールして利用することができないため、 SQLite(のような組み込み型のデータベース)の利用が選択肢となるでしょう。

一方で、高速な処理、柔軟な処理が要求される場面では、 SQLiteの機能では不十分だと感じる場面もあるかもしれません。 また、データ型の扱いに特有の癖があります。

コンソールからの利用

SQLite公式ページ ( http://www.sqlite.org/ ) の「Download」から、環境に合わせて「command-line shell」を含むファイルを取得し、解凍して利用します。(解凍するだけで利用できます。)

端末から以下のコマンドでデータベースに接続します。
"sample.db"はデータベース名で、ここで指定した名前でファイルが作成されます。 既にファイルがある場合はそこから読み込まれます。

sqlite3 sample.db

Linux環境等では以下のようにします。

./sqlite3 sample.db

これだけで、通常のSQLによるデータベース操作(create table、insert、select等)が可能となります。

例えば、以下のような動作を確認できるでしょう。

テーブル products を作成。

sqlite> CREATE TABLE products (pid INTEGER, name VARCHAR(20), price INTEGER, PRIMARY KEY (pid));

products にデータを挿入。

sqlite> INSERT INTO products VALUES(1, 'AAA', 100);
sqlite> INSERT INTO products VALUES(2, 'BBB', 80);
sqlite> INSERT INTO products VALUES(3, 'CCC', 220);

products の中身を確認。

sqlite> SELECT * FROM products;

select文の結果は以下のようになるはずです。

1|AAA|100
2|BBB|80
3|CCC|220

テーブル products を削除。

sqlite> DROP TABLE products;

SQLiteターミナルから出るには

sqlite> .exit

と打ちます。

SQLite コマンド

「.」から始まるのはSQLite独自コマンドです。以下はその一部です。

.help
SQLite独自のコマンドの説明表示
.tables
表の一覧の表示
.schema 表名
表のスキーマ(定義)を表示
.output ファイル名
以降の結果をファイルに出力 (例: .output sqliteresult.txt)
.output stdout
以降の結果を画面に表示するモードに戻る
.exit
sqliteを終了

その他、SQLiteのCommand Line Shellの使い方は http://www.sqlite.org/cli.html から確認できます。

プログラムからの利用

ここではJavaプログラムからSQLiteを利用する例を示します。Javaプログラムから関係データベースを操作する場合、対応するJDBCドライバが必要です。

SQLiteでは、SQLite JDBC Driver ( https://github.com/xerial/sqlite-jdbc ) を利用するのが楽でしょう。ダウンロードページ ( https://github.com/xerial/sqlite-jdbc/releases ) から sqlite-jdbc-(version).jar *1 を取得して、プログラムを実行するディレクトリに置いてください。

ここでは、以下のファイルをダウンロードしたものと想定して説明を続けます。

jarファイルを利用する場合、コンパイルおよび実行は以下のようにします。

javac SQLiteSample1.java
java -classpath ".:sqlite-jdbc-3.32.3.2.jar" SQLiteSample1

-classpath は単に -cp としても同じ動作となります。

java -cp ".:sqlite-jdbc-3.32.3.2.jar" SQLiteSample1

(参考) なお、Windows環境ではclasspathの区切り文字として":"ではなく";"を用います。またWindows版JDKのjavacでは、UTF-8で書かれたJavaプログラムをコンパイルする際、明示的なエンコーディング指定が必要です。

javac -encoding utf-8 SQLiteSample1.java
java -cp ".;sqlite-jdbc-3.32.3.2.jar" SQLiteSample1

以下の SQLiteSample1.java はデータベースに接続するサンプルプログラムです。

fileSQLiteSample1.java

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

public class SQLiteSample1 {

    public static void main(String[] args) throws SQLException {
        String dbname = "sample.db"; // 利用するデータベースファイル
        Connection conn = null;
        try {
            Class.forName("org.sqlite.JDBC");
            conn = DriverManager.getConnection("jdbc:sqlite:" + dbname);
            System.out.println("接続成功");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

プログラム中のdbnameで利用するデータベースファイルを指定してください。

期待される実行結果は以下の通りです。

接続成功

以下の SQLiteSample2.java はデータベースに接続し、テーブル作成、データ挿入、選択、テーブル削除するサンプルプログラムです。

(注意) プログラム中で"products"という名前でテーブルを作成、削除しているため、この名前で既にテーブルを作成している場合は別の名前に置き換えてください。

fileSQLiteSample2.java

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

public class SQLiteSample2 {

    public static void main(String[] args) throws SQLException {
        String dbname = "sample.db"; // 利用するデータベースファイル
        Connection conn = null;
        Statement stmt = null;
        try {
            Class.forName("org.sqlite.JDBC");
            conn = DriverManager.getConnection("jdbc:sqlite:" + dbname);
            System.out.println("接続成功");

            stmt = conn.createStatement();
            stmt.executeUpdate("CREATE TABLE products (pid INTEGER, name VARCHAR(20), price INTEGER, PRIMARY KEY (pid))");
            System.out.println("テーブル作成");

            stmt.executeUpdate("INSERT INTO products VALUES(1, 'AAA', 100)");
            stmt.executeUpdate("INSERT INTO products VALUES(2, 'BBB', 80)");
            stmt.executeUpdate("INSERT INTO products VALUES(3, 'CCC', 220)");
            System.out.println("データ挿入");

            ResultSet rs = stmt
                    .executeQuery("SELECT * FROM products WHERE price >= 100");
            System.out.println("選択");
            while (rs.next()) {
                int pid = rs.getInt("pid");
                String name = rs.getString("name");
                int price = rs.getInt("price");
                System.out.println(pid + "\t" + name + "\t" + price);
            }
            rs.close();

            stmt.executeUpdate("DROP TABLE products");
            System.out.println("テーブル削除");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (stmt != null) {
                    stmt.close();
                }
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

期待される実行結果は以下の通りです。

接続成功
テーブル作成
データ挿入
選択
1	AAA	100
3	CCC	220
テーブル削除

ここではSQLiteへのアクセスについて示しましたが、他の多くの関係データベースも同様の記述方法で利用できます。


*1 Javaではライブラリが *.jar という形で提供されている場合があります。これはJavaのクラスファイルを集めて圧縮したものです。

添付ファイル: fileSQLiteSample2.java 459件 [詳細] fileSQLiteSample1.java 455件 [詳細]

Last-modified: 2020-09-22 (火) 14:24:12