SQLite - C/C++ for Beginners
こんにちは、未来のプログラマーたち!今日は、C/C++を使ったSQLiteの世界に興味深く飛び込みましょう。コードを書いたことがない人も心配しないでください。私たちは非常に基本的なところから始めて、段階的に進めていきます。このチュートリアルの終わりには、あなたが成し遂げることができることに驚かれることでしょう!
SQLiteとは?
コードに飛び込む前に、SQLiteとは何かを理解しましょう。デジタルなノートブックを思い浮かべてください。あなたはその中に様々な情報を組織的に保存することができます。これがSQLiteの基本的な役割です。軽量で、ファイルベースのデータベースで、別のサーバプロセスを必要としません。まるでポケットの中にミニデータベースを持っているようなものです!
C/C++インターフェースAPI
C/C++を使ってSQLiteと対話するためには、API(アプリケーション プログラミング インターフェース)を使用する必要があります。これらは、私たちのC/C++プログラムがSQLiteと通信するための特別なツールと考えてください。以下は私たちが使用する主要なAPIです:
API関数 | 説明 |
---|---|
sqlite3_open() | SQLiteデータベースへの接続を開く |
sqlite3_exec() | SQL文を実行する |
sqlite3_close() | データベース接続を閉じる |
sqlite3_errmsg() | エラーメッセージを返す |
これらが現在少し脅威に思えるかもしれませんが、心配しないでください。それぞれを多くの例を用いて詳しく説明します!
データベースに接続する
まず、データベースに接続しましょう。これはデジタルノートブックを開いて書き始めることと同じです。
#include <stdio.h>
#include <sqlite3.h>
int main() {
sqlite3 *db;
int rc = sqlite3_open("test.db", &db);
if (rc) {
fprintf(stderr, "データベースを開けません: %s\n", sqlite3_errmsg(db));
return(0);
} else {
fprintf(stderr, "データベースを開きました\n");
}
sqlite3_close(db);
return 0;
}
以下に解説します:
- 必要なヘッダをインクルードします:
stdio.h
は入出力用、sqlite3.h
はSQLite関数用です。 -
main()
関数内でsqlite3
型のポインタを宣言し、これがデータベース接続を表します。 -
sqlite3_open()
を使って「test.db」という名前のデータベースを開かないとします。 - 接続が成功したかどうかを確認し、失敗した場合にはエラーメッセージを表示します。
- 最後にデータベース接続を閉じます。
テーブルを作成する
データベースが開いたので、情報を保存するためのページを作成しましょう。データベース用語ではこれをテーブルと呼びます。
int main() {
sqlite3 *db;
char *zErrMsg = 0;
int rc;
rc = sqlite3_open("test.db", &db);
if (rc) {
fprintf(stderr, "データベースを開けません: %s\n", sqlite3_errmsg(db));
return(0);
}
char *sql = "CREATE TABLE STUDENTS("
"ID INT PRIMARY KEY NOT NULL,"
"NAME TEXT NOT NULL,"
"AGE INT NOT NULL,"
"GRADE CHAR(1) );";
rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQLエラー: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "テーブルを作成しました\n");
}
sqlite3_close(db);
return 0;
}
この例では:
- データベースを開きます。
- SQL文を定義し、STUDENTSという名前のテーブルを作成します。ID、NAME、AGE、GRADEというカラムがあります。
-
sqlite3_exec()
を使ってこのSQL文を実行します。 - 実行が成功したかどうかを確認し、適切なメッセージを表示します。
INSERT操作
テーブルが作成されたので、データを追加しましょう。
char *sql = "INSERT INTO STUDENTS (ID,NAME,AGE,GRADE) "
"VALUES (1, 'Alice', 20, 'A' ); "
"INSERT INTO STUDENTS (ID,NAME,AGE,GRADE) "
"VALUES (2, 'Bob', 21, 'B' ); ";
rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQLエラー: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "レコードを追加しました\n");
}
ここでは、STUDENTSテーブルに2つのレコードを追加しています。SQL文はINSERT INTO構文を使って新しい行を追加します。
SELECT操作
さて、追加したデータを取得しましょう。ここがデータベースの魔法の部分です!
static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
for(int i = 0; i < argc; i++) {
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
// main()関数内で
char *sql = "SELECT * from STUDENTS";
rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQLエラー: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "操作が成功しました\n");
}
この例では、コールバック関数を導入しています。データをSELECTすると、SQLiteはこのコールバック関数を各結果行に対して呼び出します。まるでノートブックの各エントリを読み上げるアシスタントがいるようなものです!
UPDATE操作
データを間違えてしまった場合に修正するためにUPDATEを使用します。
char *sql = "UPDATE STUDENTS set GRADE = 'A' where ID=2";
rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQLエラー: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "レコードを更新しました\n");
}
このSQL文はBobの成績をAに変更します。おめでとう、Bob!
DELETE操作
データを削除する必要がある場合、DELETEを使用します。
char *sql = "DELETE from STUDENTS where ID=2";
rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQLエラー: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "レコードを削除しました\n");
}
Bobのレコードをテーブルから削除します。ごめんなさい、Bob!
そして、ここまでです!私たちはC/C++でSQLiteを扱う基本的なことをカバーしました。プログラミングは新しい言語を学ぶのと同じで、練習が必要です。すぐに理解が進まなくてもがっかりしないでください。実験を続ければ、すぐにプロのようにデータベースアプリケーションを書けるようになるでしょう!
Credits: Image by storyset