Асинхронный и динамический ORM для Rust!

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

Начало работы


Если вам нравится то, что мы делаем, присоединяйтесь, комментируйте, делитесь и вносите свой вклад!


Присоединяйтесь к нашему серверу Discord, чтобы пообщаться с другими членами сообщества SeaQL!

  • Начало работы
  • Пример использования
  • Пример Rocket
  • Пример Actix
  • Пример Axum
  • Пример поэмы

Особенности

  1. Async

    Опираясь на SQLx, SeaORM является новой библиотекой с поддержкой async с первого дня.

  2. Динамический

    Построенная на основе SeaQuery, SeaORM позволяет создавать сложные запросы без «борьбы с ORM».

  3. Тестируемый

    Используйте имитационные соединения для написания модульных тестов для вашей логики.

  4. Ориентированность на сервисы

    Быстрое создание сервисов, объединяющих, фильтрующих, сортирующих и пагинационных данных в API.

Краткое описание SeaORM

Сущность

use sea_orm::entity::prelude::*;

#[derive(Clone, Debug, PartialEq, DeriveEntityModel)]
#[sea_orm(table_name = "cake")]
pub struct Model {
    #[sea_orm(primary_key)]
    pub id: i32,
    pub name: String,
}

#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
pub enum Relation {
    #[sea_orm(has_many = "super::fruit::Entity")]
    Fruit,
}

impl Related<super::fruit::Entity> for Entity {
    fn to() -> RelationDef {
        Relation::Fruit.def()
    }
}
Вход в полноэкранный режим Выйти из полноэкранного режима

Выберите

// find all models
let cakes: Vec<cake::Model> = Cake::find().all(db).await?;

// find and filter
let chocolate: Vec<cake::Model> = Cake::find()
    .filter(cake::Column::Name.contains("chocolate"))
    .all(db)
    .await?;

// find one model
let cheese: Option<cake::Model> = Cake::find_by_id(1).one(db).await?;
let cheese: cake::Model = cheese.unwrap();

// find related models (lazy)
let fruits: Vec<fruit::Model> = cheese.find_related(Fruit).all(db).await?;

// find related models (eager)
let cake_with_fruits: Vec<(cake::Model, Vec<fruit::Model>)> =
    Cake::find().find_with_related(Fruit).all(db).await?;

Войти в полноэкранный режим Выйти из полноэкранного режима

Вставить

let apple = fruit::ActiveModel {
    name: Set("Apple".to_owned()),
    ..Default::default() // no need to set primary key
};

let pear = fruit::ActiveModel {
    name: Set("Pear".to_owned()),
    ..Default::default()
};

// insert one
let pear = pear.insert(db).await?;

// insert many
Fruit::insert_many(vec![apple, pear]).exec(db).await?;
Войти в полноэкранный режим Выйти из полноэкранного режима

Обновить

use sea_orm::sea_query::{Expr, Value};

let pear: Option<fruit::Model> = Fruit::find_by_id(1).one(db).await?;
let mut pear: fruit::ActiveModel = pear.unwrap().into();

pear.name = Set("Sweet pear".to_owned());

// update one
let pear: fruit::Model = pear.update(db).await?;

// update many: UPDATE "fruit" SET "cake_id" = NULL WHERE "fruit"."name" LIKE '%Apple%'
Fruit::update_many()
    .col_expr(fruit::Column::CakeId, Expr::value(Value::Int(None)))
    .filter(fruit::Column::Name.contains("Apple"))
    .exec(db)
    .await?;

Войти в полноэкранный режим Выйти из полноэкранного режима

Сохранить

let banana = fruit::ActiveModel {
    id: NotSet,
    name: Set("Banana".to_owned()),
    ..Default::default()
};

// create, because primary key `id` is `NotSet`
let mut banana = banana.save(db).await?;

banana.name = Set("Banana Mongo".to_owned());

// update, because primary key `id` is `Set`
let banana = banana.save(db).await?;

Войти в полноэкранный режим Выйти из полноэкранного режима

Удалить

// delete one
let orange: Option<fruit::Model> = Fruit::find_by_id(1).one(db).await?;
let orange: fruit::Model = orange.unwrap();
fruit::Entity::delete(orange.into_active_model())
    .exec(db)
    .await?;

// or simply
let orange: Option<fruit::Model> = Fruit::find_by_id(1).one(db).await?;
let orange: fruit::Model = orange.unwrap();
orange.delete(db).await?;

// delete many: DELETE FROM "fruit" WHERE "fruit"."name" LIKE 'Orange'
fruit::Entity::delete_many()
    .filter(fruit::Column::Name.contains("Orange"))
    .exec(db)
    .await?;

Войти в полноэкранный режим Выйти из полноэкранного режима

Узнать больше

  1. Дизайн
  2. Архитектура
  3. Модель выпуска
  4. Журнал изменений

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *