Введение в базу данных в C++
База данных на диске часто хранится как один файл SQLite.
Внутри лежат таблицы - именованные наборы колонок с одним типом строк. Каждая строка - запись, а отдельная колонка в записи - поле.
Программа на C++ открывает такой файл через библиотеку
sqlite3, а команды на английском языке
задают структуру и данные. Такой текст называют
SQL-запросом.
Типичная цепочка для новой таблицы: создать схему,
добавить строку и прочитать содержимое. Файл
glossary.db получит таблицу terms
и одну запись:
#include <iostream>
#include <sqlite3.h>
int main() {
sqlite3* db = nullptr;
if (sqlite3_open("glossary.db", &db) != SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << "\n";
sqlite3_close(db);
return 1;
}
char* err = nullptr;
if (sqlite3_exec(
db,
"CREATE TABLE IF NOT EXISTS terms ("
"id INTEGER PRIMARY KEY,"
"word TEXT NOT NULL,"
"hint TEXT"
")",
nullptr,
nullptr,
&err
) != SQLITE_OK) {
std::cerr << err << "\n";
sqlite3_free(err);
sqlite3_close(db);
return 1;
}
if (sqlite3_exec(
db,
"INSERT INTO terms (word, hint) "
"VALUES ('sqlite', 'embedded engine')",
nullptr,
nullptr,
&err
) != SQLITE_OK) {
std::cerr << err << "\n";
sqlite3_free(err);
sqlite3_close(db);
return 1;
}
sqlite3_stmt* stmt = nullptr;
if (sqlite3_prepare_v2(
db,
"SELECT word, hint FROM terms",
-1,
&stmt,
nullptr
) != SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << "\n";
sqlite3_close(db);
return 1;
}
while (sqlite3_step(stmt) == SQLITE_ROW) {
const char* word =
reinterpret_cast<const char*>(
sqlite3_column_text(stmt, 0)
);
const char* hint =
reinterpret_cast<const char*>(
sqlite3_column_text(stmt, 1)
);
std::cout << word << "\n";
std::cout << hint << "\n";
}
sqlite3_finalize(stmt);
sqlite3_close(db);
return 0;
}
Запрос CREATE TABLE описывает поля, INSERT
кладет значения в колонки, SELECT возвращает
выбранные столбцы. Имена таблиц и полей в SQL пишут
латиницей, как в примере с terms.