parsql-postgres
Parsql için PostgreSQL entegrasyon küfesidir. Bu paket, parsql'in PostgreSQL veritabanlarıyla çalışmasını sağlayan senkron API'leri içerir.
Özellikler
- Senkron PostgreSQL işlemleri
- Otomatik SQL sorgu oluşturma
- Güvenli parametre yönetimi
- Generic CRUD işlemleri (get, insert, update, delete)
- Client nesnesi için extension metotları
- Transaction desteği
- Veritabanı satırlarını struct'lara dönüştürme
- SQL Injection saldırılarına karşı otomatik koruma
Güvenlik Özellikleri
SQL Injection Koruması
parsql-postgres, SQL Injection saldırılarına karşı güvenli bir şekilde tasarlanmıştır:
- Tüm kullanıcı girdileri otomatik olarak parametrize edilir
- PostgreSQL'in "$1, $2, ..." parametrelendirme yapısı otomatik olarak kullanılır
- Makrolar, SQL parametrelerini güvenli bir şekilde işleyerek injection saldırılarına karşı koruma sağlar
- Parametrelerin doğru sırada ve tipte gönderilmesi otomatik olarak yönetilir
#[where_clause]
ve diğer SQL bileşenlerinde kullanıcı girdileri her zaman parametrize edilir
// SQL injection koruması örneği
// Kullanıcı girdisi (potansiyel olarak zararlı) güvenle kullanılır
let query = UserQuery ;
// Oluşturulan sorgu: "SELECT * FROM users WHERE username = $1 AND status = $2"
// Parametreler güvenli bir şekilde: [kullanici_girdisi, 1] olarak gönderilir
let user = get?;
Kurulum
Cargo.toml dosyanıza şu şekilde ekleyin:
[]
= { = "0.3.2", = ["postgres"] }
veya doğrudan bu paketi kullanmak isterseniz:
[]
= "0.3.2"
= "0.3.2"
= "0.19"
Kullanım
parsql-postgres ile çalışmak için iki farklı yaklaşım kullanabilirsiniz:
1. Fonksiyon Tabanlı Yaklaşım
use ;
use ;
use ;
2. Extension Metot Yaklaşımı (CrudOps Trait)
Bu yaklaşımda, CrudOps
trait'i sayesinde CRUD işlemlerini doğrudan Client
nesnesi üzerinden çağırabilirsiniz:
use ;
use CrudOps; // CrudOps trait'ini içe aktar
use ;
Extension metot yaklaşımı, özellikle birden fazla CRUD işleminin aynı anda yapıldığı durumlarda kodunuzu daha okunabilir ve akıcı hale getirir.
Temel Kullanım
Bu paket, PostgreSQL veritabanı ile çalışırken senkron işlemler kullanır. Bu, tokio-postgres gibi async/await kullanımı gerektirmediği anlamına gelir.
Bağlantı Kurma
use ;
CRUD İşlemleri
Veri Okuma (Get) İşlemi
use ;
use ;
Veri Ekleme (Insert) İşlemi
use ;
use ToSql;
Veri Güncelleme (Update) İşlemi
## Transaction İşlemleri
parsql-postgres ile transaction işlemlerini iki farklı şekilde gerçekleştirebilirsiniz:
### 1. CrudOps Trait'i ile Transaction Kullanımı
Bu yaklaşımda, `CrudOps` trait'i `Transaction` struct'ı için de implemente edilmiştir, böylece doğrudan transaction nesnesi üzerinden CRUD işlemlerini yapabilirsiniz:
```rust
use postgres::{Client, NoTls};
use parsql::postgres::CrudOps; // CrudOps trait'ini içe aktar
use parsql::macros::{Insertable, SqlParams, Updateable, UpdateParams};
#[derive(Insertable, SqlParams)]
#[table("users")]
struct InsertUser {
name: String,
email: String,
}
#[derive(Updateable, UpdateParams)]
#[table("users")]
#[update("email")]
#[where_clause("id = $")]
struct UpdateUser {
id: i32,
email: String,
}
fn main() -> Result<(), postgres::Error> {
let mut client = Client::connect("host=localhost user=postgres", NoTls)?;
// Transaction başlat
let mut tx = client.transaction()?;
// Transaction üzerinde CrudOps metotlarını kullan
let insert_user = InsertUser {
name: "Ali".to_string(),
email: "ali@example.com".to_string(),
};
let rows_affected = tx.insert(insert_user)?;
let update_user = UpdateUser {
id: 1,
email: "ali.updated@example.com".to_string(),
};
let rows_updated = tx.update(update_user)?;
// Transaction'ı tamamla
tx.commit()?;
Ok(())
}
2. Transaction Yardımcı Fonksiyonları ile Kullanım
Bu yaklaşımda, transactional
modülündeki yardımcı fonksiyonları kullanarak method chaining yaklaşımıyla işlemlerinizi gerçekleştirebilirsiniz:
use ;
use ;
use ;
Bu yaklaşım, özellikle transaction içinde birden fazla işlem gerçekleştirirken, transaction nesnesinin sürekli olarak elde edilebilmesini sağlar ve kod okunabilirliğini artırır.