SQLite - C/C++ для начинающих
Здравствуйте, начинающие программисты! Сегодня мы отправимся в увлекательное путешествие в мир SQLite с использованием C/C++. Не волнуйтесь, если вы еще ни разу не писали строку кода - мы начнем с самых азов и постепенно поднимемсяżej. К концу этого учебника вы будете удивлены тем, на что вы способны!
Что такое 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;
}
Разберем это:
- Мы включаем необходимые заголовки:
stdio.h
для ввода/вывода иsqlite3.h
для функций SQLite. - В функции
main()
мы声明ляем указатель наsqlite3
, который представляет наше подключение к базе данных. - Мы используем
sqlite3_open()
для открытия (или создания) базы данных с именем "test.db". - Мы проверяем, был ли успешен подключение. Если нет, мы выводим сообщение об ошибке.
- Наконец, мы закрываем подключение к базе данных с помощью
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;
}
В этом примере:
- Мы открываем базу данных, как и раньше.
- Мы определяем 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. 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