rust-ef-sqlite 1.7.0

SQLite provider for Rust Entity Framework
Documentation

lref-provider-sqlite

Crates.io License: MIT

SQLite database provider for Rust Entity Framework (lref).

Implements DatabaseProvider, SqlGenerator, and AsyncConnection traits for SQLite using rusqlite with a tokio::sync::Mutex async wrapper.


Features

  • Async-safe via Arc<Mutex<Connection>>
  • File-based and in-memory (:memory:) databases
  • WAL mode enabled by default for better concurrent read performance
  • SQLite-native parameterized queries (?)
  • Double-quoted identifier quoting ("table_name")
  • Full CRUD, transactions, AUTOINCREMENT
  • Bundled SQLite (features = ["bundled"]) - ?no system SQLite required

Quick Start

[dependencies]

lref = "0.1"

lref-provider-sqlite = "0.1"

tokio = { version = "1", features = ["full"] }

use lref::provider::DatabaseProvider;
use lref_provider_sqlite::SqliteProvider;
use std::sync::Arc;

// In-memory database
let provider = Arc::new(SqliteProvider::new_in_memory()?);

// Or file-based
// let provider = Arc::new(SqliteProvider::new("myapp.db")?);

// Get a connection
let mut conn = provider.get_connection().await?;

// Execute parameterized query
conn.execute(
    "INSERT INTO blogs (url, rating) VALUES (?, ?)",
    &[DbValue::String("https://example.com".into()), DbValue::I32(5)],
).await?;

// Query rows
let rows = conn.query(
    "SELECT * FROM blogs WHERE rating > ?",
    &[DbValue::I32(3)],
).await?;

Full Example (In-Memory CRUD)

use lref::prelude::*;
use lref_provider_sqlite::SqliteProvider;
use std::sync::Arc;

#[tokio::main]
async fn main() -> Result<(), EFError> {
    let provider = Arc::new(SqliteProvider::new_in_memory()?);

    // Create table
    let engine = lref::migration::MigrationEngine::new(
        lref::migration::MigrationDialect::Sqlite
    );
    let migration = engine.generate("init", &[Blog::entity_meta()], &None)?;
    provider.execute_migration_command(&migration.up_sql).await?;

    // CRUD operations via DbSet
    let mut db_set = DbSet::<Blog>::with_provider("blogs", provider.clone());

    // INSERT
    db_set.add(Blog { blog_id: 0, url: "https://example.com".into(), rating: 5, posts: HasMany::new() });
    lref::db_context::save_one_set(...).await?;

    // SELECT
    let blogs = db_set.query()
        .filter_column("rating", ">", 3)
        .to_list().await?;

    Ok(())
}

SQL Dialect

  • Placeholders: ? (anonymous)
  • Identifiers: "table_name" (double-quote)
  • Pagination: LIMIT t OFFSET s
  • Auto-increment: AUTOINCREMENT

License

MIT - ?see LICENSE