0Pricing
Learn Rust Coding · Урок

Запросы с проверкой во время компиляции

Типобезопасный SQL

«Запросы с проверкой во время компиляции» — бесплатный урок Learn Rust Coding на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn Rust Coding, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn Rust Coding содержит 4 уроков всего.

Ключевая возможность

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

  • Используется семейство макросов query!
  • Ошибки обнаруживаются до запуска программы

query! и query

Функция query() проверяется во время выполнения. Макрос query! проверяется во время компиляции, подключаясь к базе данных в процессе сборки.

use sqlx::{Pool, Postgres};

async fn run(pool: &Pool<Postgres>) {
    let rec = sqlx::query!("SELECT id, name FROM users WHERE id = $1", 1i32)
        .fetch_one(pool)
        .await
        .unwrap();
}

Типизированные поля результата

Макрос query! создаёт анонимную структуру, поля которой соответствуют выбранным столбцам, а правильные типы Rust выводятся из схемы.

use sqlx::{Pool, Postgres};

async fn name_of(pool: &Pool<Postgres>, id: i32) -> String {
    let rec = sqlx::query!("SELECT name FROM users WHERE id = $1", id)
        .fetch_one(pool)
        .await
        .unwrap();
    rec.name
}

Как выполняется проверка

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

Автономный режим с cargo sqlx prepare

Для CI без базы данных выполните cargo sqlx prepare, чтобы сохранить метаданные запросов в .sqlx/. После этого сборки используют кэш.

cargo sqlx prepare

query_as! в свою структуру

Используйте query_as!, чтобы напрямую сопоставлять строки со структурой, которую Вы определили; проверка при этом по-прежнему выполняется полностью.

use sqlx::{Pool, Postgres};

struct User { id: i32, name: String }

async fn get(pool: &Pool<Postgres>) -> User {
    sqlx::query_as!(User, "SELECT id, name FROM users WHERE id = $1", 1i32)
        .fetch_one(pool)
        .await
        .unwrap()
}

Столбцы с NULL становятся Option

Если столбец может содержать NULL, sqlx делает поле типа Option. Вы можете переопределить вывод типа с помощью аннотаций, например name as "name!".

use sqlx::{Pool, Postgres};

async fn maybe_email(pool: &Pool<Postgres>) -> Option<String> {
    let rec = sqlx::query!("SELECT email FROM users WHERE id = $1", 1i32)
        .fetch_one(pool)
        .await
        .unwrap();
    rec.email
}

Моделирование вывода типов

Проверка во время компиляции сопоставляет типы SQL с типами Rust. Этот запускаемый пример показывает такое решение о сопоставлении.

fn rust_type(sql: &str, nullable: bool) -> String {
    let base = match sql {
        "int4" => "i32",
        "text" => "String",
        "bool" => "bool",
        _ => "unknown",
    };
    if nullable { format!("Option<{}>", base) } else { base.to_string() }
}

fn main() {
    println!("{}", rust_type("int4", false));
    println!("{}", rust_type("text", true));
}

Ошибки компиляции, которые Вы увидите

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

  • Неверное имя столбца → ошибка во время компиляции
  • Несовместимые типы → ошибка во время компиляции

Параметры привязываются по позиции

Используйте заполнители $1, $2 для Postgres. sqlx проверяет тип каждого переданного аргумента по схеме.

use sqlx::{Pool, Postgres};

async fn search(pool: &Pool<Postgres>, name: &str, min_age: i32) {
    let _ = sqlx::query!(
        "SELECT id FROM users WHERE name = $1 AND age >= $2",
        name, min_age
    ).fetch_all(pool).await.unwrap();
}

Когда использовать форму без макроса

Для динамического SQL, создаваемого во время выполнения (если столбцы заранее неизвестны), используйте query() / query_as(). В обмен на гибкость Вы отказываетесь от проверок во время компиляции.

use sqlx::{Pool, Postgres};

async fn dynamic(pool: &Pool<Postgres>, sql: &str) {
    let _ = sqlx::query(sql).execute(pool).await.unwrap();
}

Быстрая проверка

Проверьте, насколько хорошо Вы поняли проверку во время компиляции.

Повторение

Вы изучили запросы с проверкой во время компиляции:

  • query! и query_as! проверяют SQL по схеме во время сборки
  • Поля и типы результата выводятся автоматически
  • Столбцы, допускающие NULL, становятся Option
  • cargo sqlx prepare позволяет выполнять автономные сборки
  • Для динамического SQL используйте query() без макроса

Далее: операции CRUD.

Часто задаваемые вопросы

Урок «Запросы с проверкой во время компиляции» бесплатный?

Да — полный текст урока «Запросы с проверкой во время компиляции» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn Rust Coding, подпишись на CoddyKit PRO. Курс Learn Rust Coding содержит 4 уроков всего.

Чему я научусь в уроке «Запросы с проверкой во время компиляции»?

Типобезопасный SQL Ты практикуешь Learn Rust Coding с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Learn Rust Coding?

Предыдущий опыт не требуется. Learn Rust Coding на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Запросы с проверкой во время компиляции»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Learn Rust Coding?

Да. Каждый урок Learn Rust Coding включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Подключение к базе данных
  2. Запросы с проверкой во время компиляции
  3. Операции CRUD
  4. Миграции
← Назад к Learn Rust Coding