PostgreSQL - C/C++ 인터페이스: 초보자 가이드

안녕하세요, 미래의 데이터베이스 마법사 여러분! PostgreSQL과 C/C++의 세상으로 여러분을 안내하게 되어 매우 기쁩니다. 컴퓨터 과학을 오랫동안 가르쳐온 사람으로서, 이 조합은 겨자와 레이스처럼 - 단순히 훌륭하게 잘 맞는다는 것을 말씀드릴 수 있습니다. 그麼, 우리의 손을 걷어고 바로 뛰어들어보겠습니다.

PostgreSQL - C/C++

설치

코딩을 시작하기 전에 우리의 환경을 설정해야 합니다. 이것은 요리 전에 주방을 준비하는 것과 같은 것입니다. 두 가지 주요 재료가 필요합니다:

  1. PostgreSQL
  2. libpq (PostgreSQL의 C 클라이언트 라이브러리)

Windows 사용자는 공식 웹사이트에서 PostgreSQL 설치 프로그램을 다운로드하세요. 다른 프로그램을 설치하는 것과 마찬가지로 간단합니다 - 와이저를 따라하세요!

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 함수를 제공합니다. 이 함수들은 우리의 도구들입니다, 주방에서의 스푸너와 whisk와 같은 것들입니다. 여기서 우리가 사용할 주요 함수들이 있습니다:

함수 설명
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"라는 테이블을 생성하고 있으며, 세 개의 열(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()를 사용하여 쿼리를 실행하고 있습니다. 이 함수는 우리의 쿼리에서 매개변수를 사용할 수 있게 해줍니다, 보안과 효율성이 더 좋습니다.

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);

이제 우리는 PostgreSQL과 C와의 기본 CRUD(생성, 읽기, 업데이트, 제거) 연산을 다루었습니다. 연습이 완벽을 만듭니다. 이 연산들을 결합해보세요, 오류 처리를 추가하고, 곧 PostgreSQL의 마스터가 되실 것입니다!

언제나 PQclear()를 사용하여 결과를 자유롭게 하고, PQfinish()를 사용하여 연결을 닫아야 합니다. 이것은 요리 후 주방을 청소하는 것과 같은 것입니다 - 우리의 주방(그리고 우리의 프로그램)을 원활하게 유지하는 데 도움이 됩니다.

행복한 코딩, 미래의 데이터베이스 주인님! 여러분의 쿼리가 빠르고, 연결이 절대로 끊어지지 않기를 바랍니다!

Credits: Image by storyset