Вот руководство, которое поможет вам начать работу с базами данных 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 для создания сложных веб-приложений.