Вот руководство, которое поможет вам начать работу с базами данных SQL в Rust.

По мере создания большего количества программ на Rust вам может понадобиться взаимодействие с базами данных для хранения и извлечения данных.

Строгая типизация Rust, безопасность памяти и производительность в сочетании с поддержкой асинхронных операций, ORM и миграции, обеспечивают эффективную и масштабируемую обработку данных, что делает Rust отличным выбором для создания базы данных. Приложения.

Введение в использование баз данных SQL в Rust

В экосистеме Rust есть множество ящиков баз данных и библиотек, которые обеспечивают поддержку различных парадигм баз данных.

Для баз данных SQL вы можете выбирать между драйверами базы данных, такими как libpq, Mysql-коннектор, и Sqlite3 которые предоставляют интерфейс для программ на Rust для прямого взаимодействия с базами данных без какого-либо уровня абстракции в SQL и ORM (объектно-реляционных картографах), таких как Дизель, Sqlx, и Rust-постгрес которые обеспечивают удобный способ работы с базой данных через Типы данных Rust такие как структуры и функции.

Diesel ORM — один из самых популярных пакетов баз данных в экосистеме Rust. В качестве ORM Diesel предоставляет функции от построения и выполнения запросов до определения модели и миграции схемы базы данных, упрощая взаимодействие с базами данных и писать эффективный, чистый и простой в обслуживании код.

Дизель также поддерживает несколько механизмов баз данных, включая PostgreSQL, MySQL и SQLiteи предоставляет надежный набор функций для обработки сложных операций с базами данных, таких как транзакции, соединения и агрегатные функции.

Благодаря мощным инструментам, функциям и отличной документации Diesel стал популярным выбором для многих разработчиков Rust, стремящихся создавать надежные и масштабируемые приложения, управляемые данными.

Начало работы с дизелем

Вам нужно будет добавить дизель и дотенв ящики с зависимостями вашего проекта в разделе зависимостей вашего груз.томл файл.

[зависимости]
дизель = {версия = "1.4.4", функции = ["склайт"] }
дотенв = "0.15.0"

После добавления крейтов в качестве зависимостей необходимо установить Diesel_cli Инструмент командной строки для взаимодействия с Diesel.

Запустите эту команду, чтобы установить Diesel_cli инструмент:

грузовая установка Diesel_cli

Вы можете вызвать инструмент CLI с помощью дизель команду после установки инструмента.

Затем создайте файл переменных среды и укажите URL-адрес вашей базы данных.

Запустите эту команду, чтобы создать и вставить URL-адрес базы данных для базы данных SQLite в памяти.

эхо DATABASE_URL=database.db > .env

Для работы с Diesel необходимо установить sqlite3 или предпочитаемую базу данных на свой компьютер.

Наконец, запустите настраивать Команда для Diesel, чтобы настроить базу данных для вашего проекта:

дизельная установка

настраивать команда создает миграции каталог, создает базу данных, указанную в DATABASE_URLи запускает существующие миграции.

Настройка миграции с помощью Diesel

После настройки вашей базы данных с помощью Diesel вы будете использовать миграция генерировать Команда для создания файлов миграции. Вы добавите имя файла в качестве аргумента:

дизельная миграция генерирует create_humans

Команда создает два файла SQL в миграции каталог: up.sql и вниз.sql.

Вы напишете SQL для определений таблиц вашей базы данных в up.sql файл:

-- Ваш SQL идет сюда

СОЗДАВАТЬСТОЛ"человек"
(
"id" INTEGER NOT NULL ПЕРВИЧНЫЙ КЛЮЧ АВТОИНКРЕМЕНТ,
ТЕКСТ "first_name" НЕ NULL,
"last_name" ТЕКСТ НЕ NULL,
"возраст" ЦЕЛОЕ ЧИСЛО НЕ NULL
);

Вы напишете код SQL для удаления таблиц базы данных в вниз.sql файл:

-- вниз.sql

-- Этот файл должен отменить что-либо в `up.sql`
УРОНИТЬСТОЛ"человек"

После записи файлов SQL запустите прогон миграции Команда для применения ожидающих миграций.

прогон миграции дизельного топлива

Кроме того, вы можете использовать миграция повторить команда для отмены миграции:

повтор переноса дизельного топлива

Кроме того, вы можете использовать схема печати команда для печати схемы. Команда выводит содержимое файла схема.rs файл.

дизельная схема печати

Результат print_schema command — это код Rust, соответствующий вашей схеме SQL:

Подключение к базе данных SQL с помощью Diesel

Во-первых, добавьте эти импорты и директивы в ваш файл:

мод схема;

#[использование_макро]
внешнийящик дизель;
использовать дотенв:: дотенв;
использовать дизель:: прелюдия::*;
использовать станд:: env;
использовать Diesel::{Connection, ExpressionMethods, QueryDsl, RunQueryDsl, SqliteConnection};
использовать ящик:: схема:: человек;

Вы будете использовать импорт и директивы для подключения к базе данных и выполнения операций.

Вот как вы можете подключиться к базе данных SQLite с помощью функции и вернуть экземпляр соединения:

использовать станд:: env;
использовать дизель::{Соединение, SqliteConnection};

фнустановить_соединение() -> SqliteConnection {
dotenv().ok();

позволять database_url = env:: var("URL_БАЗА_ДАННЫХ")
.ожидать("DATABASE_URL должен быть установлен");
SqliteConnection:: установить (& database_url)
.unwrap_or_else(|_| паника!("Ошибка подключения к {}", база_данных))
}

установить_соединение функция возвращает структуру экземпляра соединения (SqliteConnection). установить_соединение загружает переменные среды с помощью хорошо функция, обращается к URL-адресу базы данных с вар функции и устанавливает соединение с базой данных через URL-адрес с учреждать функция.

После успешного подключения вы можете выполнять запросы и вставлять их в свою базу данных.

Вставка значений в базу данных с помощью Diesel

Вы будете использовать структуру, соответствующую вашей схеме SQL, для вставки значений в базу данных.

Вот структура, которая соответствует человек схема таблицы:

#[получить (под запрос)]
пабструктураЧеловек {
паб идентификатор: i32,
паб имя: Нить,
паб фамилия: Нить,
паб возраст: i32,
}

Функция вставки вернет экземпляр Человек тип для других операций.

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

Вот структура операции вставки:

#[получить (вставляемый)]
#[имя_таблицы = "человек"]
структурановыйчеловек<а> {
имя: &аул,
фамилия: &аул,
возраст: i32,
}

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

фнвставка_в<а>(подключение: &SqliteConnection, first_name: &аул, фамилия: &аул, возраст: i32) -> Человек {
использовать ящик:: схема:: человек;

позволять new_human = новый человек {
имя,
фамилия,
возраст,
};

Diesel:: insert_into (human:: table).values(&new_human).execute (conn).expect("Ошибка добавления нового человека");

человек:: table.order (человек:: id.desc()).first (conn).unwrap()
}

вставка_в Функция принимает параметры и вставляет значения в базу данных с помощью Дизеля. вставка_в функция, которая принимает таблицу и ценности функция, которая принимает экземпляр структуры. Функция присваивает идентификатор в порядке убывания с описание функцию перед выполнением операции.

Вот основной функция, которая вызывает вставка_в функция:

фносновной() {
позволять соединение = установить_соединение();
позволять new_human = insert_into(&conn, "Джон", "Доу", 25);
распечатать!("Добавлен новый человек с идентификатором: {}", new_human.id);

}

соединение переменная является экземпляром соединения, а new_human переменная - это вызов функции. основной Функция печатает идентификатор после успешной операции.

Запросы к базам данных с помощью Diesel

В качестве альтернативы, ваша структура функции запроса будет реализовывать Запрашиваемый атрибут с вывести макрос.

Вот структура операции запроса:

// Определяем структуру, представляющую строку в вашей таблице
#[получить (под запрос)]
структураЧеловек {
идентификатор: i32,
имя: Нить,
фамилия: Нить,
возраст: i32,
}

Функция запроса примет экземпляр соединения и вернет Человек структура следующим образом:

фнquery_db(подключение: &SqliteConnection) -> Человек {
человеческий.фильтр (возраст.экв.(25)).первый (подключение).ожидание("Ошибка запроса базы данных")
}

query_db функция фильтрует человеческую таблицу для строки, где возраст равно 25 и возвращает первое вхождение как экземпляр структуры.

фносновной() {

позволять соединение = установить_соединение();
позволять человек = query_db(&conn);

распечатать!("ИДЕНТИФИКАТОР: {}", человек.id);
распечатать!("Имя: {}", человек.имя);
распечатать!("Фамилия: {}", лицо.фамилия);
распечатать!("Возраст: {}", чел.возраст);
}

в основной функция, человек переменная вызывает query_db функция и печатает поля строки со значением возраста, равным 25.

Вы можете создавать веб-серверы на Rust

Rust продолжает набирать популярность в веб-разработке как серверный язык с такими библиотеками, как Actix-web и Ракета которые упрощают настройку серверов и создание API и веб-сайтов за счет абстрагирования сложной функциональности.

Большинству веб-серверов приходится взаимодействовать с базами данных для хранения и поиска данных. Вы можете дополнительно интегрировать свои приложения на основе Diesel с Actix-web или Rocket для создания сложных веб-приложений.