lilydocs
HTTP APIWebSocketConsumer
Veri3 dk okuma

PostgreSQL

Lily’nin yönettiği pool ve Diesel sorgularıyla veri katmanını kurun.

lily_postgresql, pool, TLS, configuration ve bağlantı yaşam döngüsünü yönetir. Schema, entity ve query Diesel’e aittir. Repository kullanmak zorunlu değildir.

Bağımlılıklar ve bağlantı#

Çalışan PostgreSQL ve önceden hazırlanmış schema gerekir. İlk uygulamadaki lilyrs satırına postgresql feature’ını ekleyin; bu single modu seçer. Repository örneğinin Diesel bağımlılığını da tanımlayın:

Cargo.toml ekleri
lilyrs = { version = "0.1.0", features = ["http-api", "postgresql"] }
diesel = { version = "=2.3.11", features = ["postgres"] }
TOML
[postgresql]
mode = "single"
connection_string = "postgresql://lily:lily@127.0.0.1:5432/lily"

[postgresql.tls]
mode = "disable"

[postgresql.pool]
max_size = 10
acquire_timeout_secs = 5
transaction_cleanup_timeout_secs = 5

Bu bağlantı yerel geliştirme içindir. Production config doğrulaması verify-full TLS ister; disable reddedilir. Production’da secret reference ve uygun CA/hostname doğrulaması kullanın. PostgreSQL ayarları [postgresql] altındadır; [database] MongoDB içindir.

Veri erişimi seçimi#

Yol Kullanım
PgDatabaseService with_connection(callback, cancellation) ile doğrudan Diesel
PgRepository derive Generated CRUD ve *_in yöntemleri
PgDbContext Aynı request içindeki workflow ve repository transaction paylaşımı

Varsayılan single mod Singleton PgDatabaseService ve Scoped PgDbContext kaydeder. Doğrudan callback (&mut AsyncPgConnection, Option<ExecutionCancellation>) alır ve Box::pin(async move { ... }) döndürür. Desteklenen Diesel sürümleri crate’ten yeniden export edilir.

İsteğe bağlı repository#

pg_repository.rs
use std::sync::Arc;
use diesel::prelude::*;
use lilyrs::http_api::Injectable;
use lilyrs::http_api::ServiceTrait;
use lilyrs::postgresql::{PgDatabaseService, PgRepository};

diesel::table! {
    users (id) {
        id -> BigInt,
        name -> Text,
    }
}

#[derive(Clone, Queryable, Selectable, Identifiable, Insertable, AsChangeset)]
#[diesel(table_name = users)]
#[diesel(check_for_backend(diesel::pg::Pg))]
struct User {
    #[diesel(skip_insertion)]
    #[diesel(skip_update)]
    id: i64,
    name: String,
}

#[derive(Default, Injectable, PgRepository)]
#[service(lifetime = "Singleton")]
#[pg(entity = User)]
struct UserRepository {
    #[inject]
    database: Arc<PgDatabaseService>,
}
impl ServiceTrait for UserRepository {}

PgRepository tek başına DI kaydı yapmaz; örnekteki Injectable ve ServiceTrait de gerekir. Generated yöntemler create, create_many, find_by_id, find_by_ids, update, delete_by_id, count, exists ve *_in biçimleridir.

Migration ve transaction#

run_pending_migrations açık bir başlangıç/deployment işlemidir. Request başına DDL çalıştırmayın. Bir sonraki sayfa, controller’dan iki repository çağrısına yayılan transaction’ın tamamını gösterir.

Birden fazla veritabanı#

Facade’de postgresql yerine postgresql-factory seçin: features = ["http-api", "postgresql-factory"]. lilyrs::postgresql::PgFactory üzerinden named database’lere erişilir. Base postgresql feature’ı single modu açtığından factory ile birlikte seçilmez; başka workspace üyelerinin feature birleşimi de bu çakışmaya yol açabilir. Inject edilen factory’den get(name) ile database alınır. Named PgDbContext uygulamaya ait scoped wrapper’da kurulur ve wrapper temizliği context’e iletir. Single koduna yalnız feature eklemek yeterli değildir; config topolojisi ve initializer da factory modeline uymalıdır.

Bu sayfanın kaynakları v0.1.0

Anlatım, incelenen framework commit’ine dayanır.

HIZLI BAŞLANGIÇ
Dokümantasyon
Kaynak kod