PostgreSQL - C/C++ インターフェース:初めてのガイド

こんにちは、未来のデータベース魔术師さんたち!私は、PostgreSQLとC/C++の世界への興奮人心的な旅を案内するお手伝いをすることにワクワクしています。コンピュータサイエンスを多年間教えてきた者として、この組み合わせはピーナッツバターとジャムのようで、非常に上手くいくことをお約束します!では、腕をまくって、いきましょう。

PostgreSQL - C/C++

インストール

コードを書く前に、環境を整える必要があります。これを、美食の調理前にキッチンを準備することに例えると良いでしょう。以下の2つの主要な要素が必要です:

  1. PostgreSQL
  2. libpq (PostgreSQLのCクライアントライブラリ)

Windowsユーザーの場合、公式ウェブサイトからPostgreSQLインストーラーをダウンロードします。他のプログラムと同様に簡単にインストールできます - ワizardに従ってください!

Linuxユーザーの皆さんの場合は、さらに簡単です。ターミナルを開き、以下のコマンドを実行します:

sudo apt-get install postgresql postgresql-contrib libpq-dev

Macユーザーの皆さんもお手上げではありません!Homebrewを使用して:

brew install postgresql

インストール後は、PostgreSQLサービスを起動するのを忘れないでください。ほとんどのシステムでは、以下のコマンドでできます:

sudo service postgresql start

素晴らしい!今、私たちのキッチン(つまり、開発環境)は準備ができました。では、調理...つまり、コードを書き始めましょう!

C/C++ インターフェース API

PostgreSQLは、データベースと対話するためのC関数セットを提供しています。これらの関数は、キッチンのスパトゥラやバターンのようなツールです。以下は、私たちが使用する主要なものです:

関数 説明
PQconnectdb() データベースに接続
PQfinish() データベース接続を閉じる
PQexec() SQLコマンドを実行
PQstatus() 接続の状態を確認
PQresultStatus() クエリの結果を確認
PQntuples() 結果の行数を返す
PQnfields() 結果の列数を返す
PQgetvalue() 結果からフィールド値を取得

これらが現在は脅威に見えるかもしれませんが、心配しないでください。すぐにこれらを使い、実際にどれほど親しみやすいかを感じるでしょう!

データベースに接続

まずは基本から - データベースに接続しましょう。これは、ドアをノックして、「こんにちは、PostgreSQL!入れてもいいですか?」と言うようなものです。

#include <stdio.h>
#include <stdlib.h>
#include <libpq-fe.h>

int main() {
PGconn *conn = PQconnectdb("dbname=testdb user=john password=secret");

if (PQstatus(conn) == CONNECTION_BAD) {
fprintf(stderr, "データベース接続に失敗しました: %s\n", PQerrorMessage(conn));
PQfinish(conn);
exit(1);
}

printf("データベースに接続しました!\n");
PQfinish(conn);
return 0;
}

これを分解すると:

  1. 必要なヘッダーをインクルードし、libpq-fe.hはPostgreSQL関数にアクセスするためのものです。
  2. PQconnectdb()を使用してデータベースに接続します。\"testdb\"、\"john\"、\"secret\"を実際のデータベース名、ユーザー名、パスワードに置き換えてください。
  3. 接続が成功したかどうかをPQstatus()で確認します。
  4. 成功した場合、喜びのメッセージを表示します。失敗した場合、エラーを表示して終了します。
  5. 最後に、接続を閉じるためにPQfinish()を使用します。

このプログラムを以下のコマンドでコンパイルします:

gcc -o connect connect.c -I/usr/include/postgresql -lpq

実行すると、すべてが上手くいった場合、「データベースに接続しました!」と表示されます。おめでとうございます、PostgreSQLと握手を交わしました!

テーブルの作成

今、中に入ったので、テーブルを作成しましょう。これは、Excelで新しいスプレッドシートを設定することに似ています。

PGresult *res = PQexec(conn, "CREATE TABLE students (id SERIAL PRIMARY KEY, name VARCHAR(100), age INT)");

if (PQresultStatus(res) != PGRES_COMMAND_OK) {
fprintf(stderr, "テーブルの作成に失敗しました: %s\n", PQerrorMessage(conn));
PQclear(res);
PQfinish(conn);
exit(1);
}

printf("テーブルを作成しました!\n");
PQclear(res);

ここでは、PQexec()を使用してSQLコマンドを実行しています。\"students\"という名前のテーブルを作成し、3つのカラム(id、name、age)を持たせています。SERIAL型のidは、新しいエントリごとに自動的にインクリメントされるため、非常に便利です!

INSERT 操作

テーブルにデータを追加しましょう。これは、スプレッドシートの行を記入することに似ています。

const char *insert_query = "INSERT INTO students (name, age) VALUES ($1, $2)";
const char *param_values[2] = {"Alice", "20"};
int param_lengths[2] = {strlen(param_values[0]), strlen(param_values[1])};
int param_formats[2] = {0, 0};

PGresult *res = PQexecParams(conn, insert_query, 2, NULL, param_values, param_lengths, param_formats, 0);

if (PQresultStatus(res) != PGRES_COMMAND_OK) {
fprintf(stderr, "INSERTに失敗しました: %s\n", PQerrorMessage(conn));
PQclear(res);
PQfinish(conn);
exit(1);
}

printf("データを追加しました!\n");
PQclear(res);

ここでは、PQexecParams()を使用してパラメータを使用したクエリを実行しています。$1$2はパラメータのプレースホルダーです。

SELECT 操作

今度はデータを取得しましょう。これは、スプレッドシートに書かれたことを確認するようなものです。

PGresult *res = PQexec(conn, "SELECT * FROM students");

if (PQresultStatus(res) != PGRES_TUPLES_OK) {
fprintf(stderr, "SELECTに失敗しました: %s\n", PQerrorMessage(conn));
PQclear(res);
PQfinish(conn);
exit(1);
}

int rows = PQntuples(res);
int cols = PQnfields(res);

for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
printf("%s\t", PQgetvalue(res, i, j));
}
printf("\n");
}

PQclear(res);

ここでは、PQntuples()を使用して行数を取得し、PQnfields()で列数を取得し、PQgetvalue()で各値を取得します。

UPDATE 操作

時々、データを変更する必要があります。Aliceの年齢を更新しましょう:

const char *update_query = "UPDATE students SET age = $1 WHERE name = $2";
const char *param_values[2] = {"21", "Alice"};
int param_lengths[2] = {strlen(param_values[0]), strlen(param_values[1])};
int param_formats[2] = {0, 0};

PGresult *res = PQexecParams(conn, update_query, 2, NULL, param_values, param_lengths, param_formats, 0);

if (PQresultStatus(res) != PGRES_COMMAND_OK) {
fprintf(stderr, "UPDATEに失敗しました: %s\n", PQerrorMessage(conn));
PQclear(res);
PQfinish(conn);
exit(1);
}

printf("データを更新しました!\n");
PQclear(res);

これはINSERT操作と似ていますが、UPDATE SQLコマンドを使用しています。

DELETE 操作

最後に、データを削除する方法を学びましょう。これは、スプレッドシートの行を消去することに似ています。

const char *delete_query = "DELETE FROM students WHERE name = $1";
const char *param_values[1] = {"Alice"};
int param_lengths[1] = {strlen(param_values[0])};
int param_formats[1] = {0};

PGresult *res = PQexecParams(conn, delete_query, 1, NULL, param_values, param_lengths, param_formats, 0);

if (PQresultStatus(res) != PGRES_COMMAND_OK) {
fprintf(stderr, "DELETEに失敗しました: %s\n", PQerrorMessage(conn));
PQclear(res);
PQfinish(conn);
exit(1);
}

printf("データを削除しました!\n");
PQclear(res);

そして、ここでCRUD(Create、Read、Update、Delete)操作の基本をカバーしました。練習を重ねることで、これらの操作を組み合わせ、エラーハンドリングを追加し、すぐにPostgreSQLの忍者になるでしょう!

常に、PQclear()を使用して結果を解放し、PQfinish()を使用して接続を閉じることを忘れないでください。これは、調理後の掃除のように、キッチン(そしてプログラム)をスムーズに保つためです。

未来のデータベースマスターさんたち、お楽しみください!あなたのクエリが早くて、接続が切れないことを祈っています!

Credits: Image by storyset