Подключение к базе данных
Пулы sqlx
«Подключение к базе данных» — бесплатный урок Learn Rust Coding на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn Rust Coding, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn Rust Coding содержит 4 уроков всего.
Что такое sqlx?
sqlx — это асинхронный набор инструментов для SQL, написанный на чистом Rust. Это не ORM: Вы пишете настоящий SQL, но получаете проверку во время компиляции и типобезопасные результаты.
- Поддерживает Postgres, MySQL и SQLite
- Работает на асинхронных средах выполнения, таких как Tokio
Добавление sqlx
Объявите sqlx с нужной средой выполнения и функциями базы данных. Эта команда изменяет Cargo.toml и запускается в терминале.
[dependencies]
sqlx = { version = "0.7", features = ["runtime-tokio", "postgres"] }
tokio = { version = "1", features = ["full"] }Строки подключения
Строка подключения (DSN) сообщает sqlx, как обратиться к базе данных.
- Postgres:
postgres://user:pass@host:5432/dbname - SQLite:
sqlite://app.db
Зачем нужен пул подключений?
Открывать отдельное подключение для каждого запроса медленно. Пул хранит набор повторно используемых подключений, выдаёт их по мере необходимости, а затем принимает обратно.
- Ограничивает параллелизм
- Распределяет стоимость установки подключений
Создание пула
Используйте PgPoolOptions, чтобы настроить и подключить пул. Обычно это выполняется один раз при запуске.
use sqlx::postgres::PgPoolOptions;
async fn connect() -> sqlx::Pool<sqlx::Postgres> {
PgPoolOptions::new()
.max_connections(5)
.connect("postgres://user:pass@localhost/app")
.await
.unwrap()
}Настройка пула
Настройте пул с помощью таких параметров, как максимальное число подключений и время ожидания получения подключения, в соответствии с рабочей нагрузкой.
use sqlx::postgres::PgPoolOptions;
use std::time::Duration;
fn options() -> PgPoolOptions {
PgPoolOptions::new()
.max_connections(10)
.acquire_timeout(Duration::from_secs(3))
}Простой запрос через пул
Передайте пул или ссылку на него как исполнитель, чтобы выполнить запрос. Пул автоматически выдаст подключение.
use sqlx::Pool;
use sqlx::Postgres;
async fn ping(pool: &Pool<Postgres>) -> i32 {
let row: (i32,) = sqlx::query_as("SELECT 1")
.fetch_one(pool)
.await
.unwrap();
row.0
}Моделирование пула в обычном Rust
С концептуальной точки зрения пул — это ограниченная коллекция повторно используемых ресурсов. Этот запускаемый пример показывает получение и возврат ресурса.
struct Pool { available: u32, max: u32 }
impl Pool {
fn acquire(&mut self) -> bool {
if self.available > 0 { self.available -= 1; true } else { false }
}
fn release(&mut self) { self.available += 1; }
}
fn main() {
let mut p = Pool { available: 2, max: 2 };
println!("{}", p.acquire());
println!("{}", p.acquire());
println!("{}", p.acquire());
p.release();
println!("{}", p.acquire());
}Чтение DSN из окружения
Не храните секреты в исходном коде. Прочитайте DATABASE_URL из окружения при запуске.
use sqlx::postgres::PgPoolOptions;
async fn connect() -> sqlx::Pool<sqlx::Postgres> {
let url = std::env::var("DATABASE_URL").unwrap();
PgPoolOptions::new().connect(&url).await.unwrap()
}Клонирование — дешёвая операция
Pool внутри использует подсчёт ссылок. Его клонирование совместно использует те же базовые подключения, поэтому клоны можно свободно передавать задачам.
use sqlx::{Pool, Postgres};
async fn spawn_work(pool: Pool<Postgres>) {
let p2 = pool.clone();
tokio::spawn(async move {
let _ = sqlx::query("SELECT 1").execute(&p2).await;
});
}Закрытие пула
При завершении работы вызовите close().await, чтобы корректно дождаться завершения операций и закрыть все подключения.
use sqlx::{Pool, Postgres};
async fn shutdown(pool: Pool<Postgres>) {
pool.close().await;
}Быстрая проверка
Проверьте, насколько хорошо Вы поняли подключение с помощью sqlx.
Повторение
Вы научились подключаться с помощью sqlx:
- sqlx — это асинхронный типобезопасный набор инструментов для SQL, а не ORM
- DSN описывает расположение базы данных
- Используйте
PgPoolOptions, чтобы создать пул с ограничениями и тайм-аутами - Пулы можно дёшево клонировать; при завершении работы их следует закрывать
Далее: запросы с проверкой во время компиляции.
Часто задаваемые вопросы
Урок «Подключение к базе данных» бесплатный?
Да — полный текст урока «Подключение к базе данных» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn Rust Coding, подпишись на CoddyKit PRO. Курс Learn Rust Coding содержит 4 уроков всего.
Чему я научусь в уроке «Подключение к базе данных»?
Пулы sqlx Ты практикуешь Learn Rust Coding с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Learn Rust Coding?
Предыдущий опыт не требуется. Learn Rust Coding на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Подключение к базе данных»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Learn Rust Coding?
Да. Каждый урок Learn Rust Coding включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Подключение к базе данных
- Запросы с проверкой во время компиляции
- Операции CRUD
- Миграции