SQLite - C/C++ для начинающих

Здравствуйте, начинающие программисты! Сегодня мы отправимся в увлекательное путешествие в мир SQLite с использованием C/C++. Не волнуйтесь, если вы еще ни разу не писали строку кода - мы начнем с самых азов и постепенно поднимемсяżej. К концу этого учебника вы будете удивлены тем, на что вы способны!

SQLite - C/C++

Что такое SQLite?

Прежде чем погрузиться в код, давайте поймем, что такое SQLite. Представьте себе цифровой блокнот, в котором вы можете хранить самую разную информацию в организованном виде. Это, по сути, и есть SQLite - легковесная, основанная на файлах база данных, не требующая отдельного серверного процесса. Это как having a mini-database right in your pocket!

API интерфейса C/C++

Чтобы взаимодействовать с SQLite с использованием C/C++, нам нужно использовать что-то называемое API (Application Programming Interfaces). Представьте себе эти special tools, которые позволяют нашей программе на C/C++ communicate with 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;
}

Разберем это:

  1. Мы включаем необходимые заголовки: stdio.h для ввода/вывода и sqlite3.h для функций SQLite.
  2. В функции main() мы声明ляем указатель на sqlite3, который представляет наше подключение к базе данных.
  3. Мы используем sqlite3_open() для открытия (или создания) базы данных с именем "test.db".
  4. Мы проверяем, был ли успешен подключение. Если нет, мы выводим сообщение об ошибке.
  5. Наконец, мы закрываем подключение к базе данных с помощью sqlite3_close().

Создание таблицы

Теперь, когда наш блокнот открыт, давайте создадим страницу для хранения информации. В терминологии баз данных это называется таблицей.

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

В этом примере:

  1. Мы открываем базу данных, как и раньше.
  2. Мы определяем SQL-запрос для создания таблицы с именем STUDENTS с колонками ID, NAME, AGE и GRADE.
  3. Мы используем sqlite3_exec() для выполнения этого SQL-запроса.
  4. Мы проверяем, была ли выполнения успешной и выводим соответствующее сообщение.

Операция 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. SQL-запрос использует синтаксис INSERT INTO для добавления новых строк.

Операция SELECT

Теперь давайте retrievedata, которое мы только что inserted. Это где真正的 магия баз данных сияет!

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

Этот пример introduces a callback function. Когда мы выбираем данные, 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

Иногда нам нужно удалить данные. Давайте посмотрим, как удалить запись.

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!

И вот мы и рассмотрели основы работы с SQLite в C/C++. Помните, программирование - это как учить новый язык - это требует практики. Не отчаивайтесь, если все не срабатывает сразу. Продолжайте экспериментировать, и скоро вы будете писать приложения с базами данных, как профессионал!

Credits: Image by storyset