| Crates.io | parsql |
| lib.rs | parsql |
| version | 0.5.0 |
| created_at | 2024-12-12 21:50:23.278475+00 |
| updated_at | 2025-08-01 05:26:27.000613+00 |
| description | Deneyimsel bir sql yardımcı küfesidir. UYARI: bu bir ORM aracı değildir. Amaç sql yazımı ve kullanımında basit cümlecikler için kolaylık sağlamaktır. |
| homepage | |
| repository | https://github.com/yazdostum-nettr/parsql |
| max_upload_size | |
| id | 1481688 |
| size | 79,237 |
Deneyimsel bir sql yardımcı küfesidir. Bu bir ORM aracı değildir. Amaç sql yazımı ve kullanımında basit cümlecikler için kolaylık sağlamaktır.
limit ve offset öznitelikleri ile verimli sayfalama yapabilirsinizQueryable türetme özniteliği, tablo adı, where ifadesi, select ifadesi, group by, having, order by, limit ve offset ifadeleri için destek sağlar.Insertable türetme özniteliği, tabloya özgü INSERT ifadeleri oluşturur.Updateable türetme özniteliği, tabloya özgü UPDATE ifadeleri oluşturur.Deletable türetme özniteliği, tabloya özgü DELETE ifadeleri oluşturur.SqlParams türetme özniteliği, yapının SQL parametreleri için kullanılmasını sağlar.UpdateParams türetme özniteliği, yapının UPDATE ifadeleri için kullanılmasını sağlar.FromRow türetme özniteliği, veritabanı satırlarının yapıya dönüştürülmesini sağlar.PARSQL_TRACE çevre değişkeni desteği eklendi.Parsql, SQL sorgularınızı doğrudan Rust struct'ları üzerinden yönetmenize olanak tanıyan bir kütüphanedir. Temel amacı, veritabanı işlemlerini daha güvenli ve daha az kod ile gerçekleştirmenizi sağlamaktır. Bu kütüphane ile:
Pool ve Transaction nesneleri üzerinde extension method'lar kullanabilirsinizParsql standart bir ORM değildir. Daha çok, SQL yazımını ve kullanımını basitleştirmeye odaklanır.
Parsql aşağıdaki veritabanı sistemlerini desteklemektedir:
parsql-sqlite paketiparsql-postgres paketiparsql-tokio-postgres paketiparsql-deadpool-postgres paketiCargo.toml içinde aşağıdaki şekilde tanımlama yapın:
[dependencies]
parsql = { version = "0.5.0", features = ["sqlite"] }
veya PostgreSQL için:
[dependencies]
parsql = { version = "0.5.0", features = ["postgres"] }
veya Tokio PostgreSQL için:
[dependencies]
parsql = { version = "0.5.0", features = ["tokio-postgres"] }
veya Deadpool PostgreSQL için:
[dependencies]
parsql = { version = "0.5.0", features = ["deadpool-postgres"] }
Parsql artık tüm yaygın kullanılan trait'ler, makrolar ve tipleri içeren bir prelude modülü sunmaktadır:
use parsql::prelude::*;
Bu import ile şunlara erişebilirsiniz:
Queryable, Insertable, Updateable, Deletable, FromRow, SqlParams, UpdateParams)CrudOps, FromRow, SqlParams, SqlQuery, SqlCommand, UpdateParams)Row, ToSql, Connection, Error, vb.)SqliteConnectionExt, PostgresConnectionExt, vb.)Parsql, veritabanı işlemlerini kolaylaştırmak için çeşitli procedural makrolar sunar:
#[derive(Queryable)] - Okuma (select) işlemleri için#[derive(Insertable)] - Ekleme işlemleri için#[derive(Updateable)] - Güncelleme işlemleri için#[derive(Deletable)] - Silme işlemleri için#[derive(FromRow)] - Veritabanı sonuçlarını nesnelere dönüştürmek için#[derive(SqlParams)] - SQL parametrelerini yapılandırmak için#[derive(UpdateParams)] - Güncelleme parametrelerini yapılandırmak içinParsql, 0.3.3 sürümünden itibaren, CRUD işlemlerini doğrudan veritabanı nesneleri üzerinden yapmanızı sağlayan extension metotları sunmaktadır. Bu yaklaşım sayesinde kodunuz daha akıcı ve okunabilir hale gelir.
Bağlantı havuzu (Pool) nesneleri üzerinde doğrudan CRUD işlemleri yapabilirsiniz:
// Geleneksel kullanım
let rows_affected = insert(&pool, user).await?;
// Extension metodu ile kullanım (prelude ile otomatik gelir)
let rows_affected = pool.insert(user).await?;
Transaction nesneleri üzerinde doğrudan CRUD işlemleri yapabilirsiniz:
// Geleneksel kullanım
let (tx, rows_affected) = tx_insert(tx, user).await?;
// Extension metodu ile kullanım (prelude ile otomatik gelir)
let rows_affected = tx.insert(user).await?;
Hem Pool hem de Transaction nesneleri için şu extension metodları kullanılabilir:
insert(entity) - Kayıt eklerupdate(entity) - Kayıt güncellerdelete(entity) - Kayıt silerfetch(params) - Tek bir kayıt getirirfetch_all(params) - Birden fazla kayıt getirirselect(entity, to_model) - Özel dönüştürücü fonksiyon ile tek kayıt getirirselect_all(entity, to_model) - Özel dönüştürücü fonksiyon ile çoklu kayıt getirirParsql şu anda aşağıdaki paketlerde transaction desteği sunmaktadır:
parsql-postgres - Senkron PostgreSQL işlemleri için transaction desteğiparsql-tokio-postgres - Asenkron Tokio-PostgreSQL işlemleri için transaction desteğiparsql-deadpool-postgres - Asenkron Deadpool PostgreSQL bağlantı havuzu için transaction desteğiÖrnek bir transaction kullanımı:
// Transaction başlatma
let client = pool.get().await?;
let tx = client.transaction().await?;
// Extension method kullanarak transaction içinde işlem yapma
let result = tx.insert(user).await?;
let rows_affected = tx.update(user_update).await?;
// İşlem başarılı olursa commit
tx.commit().await?;
Parsql, SQL injection saldırılarına karşı güvenli bir şekilde tasarlanmıştır:
$1, ?, vb.) otomatik olarak uygulanır// Güvenli parametre kullanımı örneği
#[derive(Queryable, FromRow, SqlParams)]
#[table("users")]
#[where_clause("username = $ AND status = $")]
struct UserQuery {
username: String,
status: i32,
}
// Parametreler güvenli bir şekilde yerleştirilir,
// SQL injection riski olmaz
let query = UserQuery {
username: user_input,
status: 1,
};
Sorgularınızı özelleştirmek için çeşitli öznitelikler kullanabilirsiniz:
#[table("tablo_adi")] - Tablo adını belirtmek için#[where_clause("id = $")] - WHERE koşulunu belirtmek için#[select("alan1, alan2")] - SELECT ifadesini özelleştirmek için#[update("alan1, alan2")] - UPDATE ifadesini özelleştirmek için#[join("LEFT JOIN tablo2 ON tablo1.id = tablo2.fk_id")] - JOIN ifadeleri için#[group_by("alan1")] - GROUP BY ifadesi için#[order_by("alan1 DESC")] - ORDER BY ifadesi için#[having("COUNT(*) > 5")] - HAVING ifadesi için#[limit(10)] - LIMIT ifadesi için#[offset(5)] - OFFSET ifadesi için#[returning("id")] - INSERT/UPDATE işlemlerinden dönen değerleri belirtmek içinGeliştirme sırasında oluşturulan SQL sorgularını izlemek için:
PARSQL_TRACE=1 cargo run
Bu, çalıştırılan tüm SQL sorgularını konsola yazdıracaktır.
use parsql::prelude::*;
// Bir kayıt almak için
#[derive(Queryable, FromRow, SqlParams, Debug)]
#[table("users")]
#[where_clause("id = $")]
pub struct GetUser {
pub id: i64,
pub name: String,
pub email: String,
}
impl GetUser {
pub fn new(id: i64) -> Self {
Self {
id,
name: Default::default(),
email: Default::default(),
}
}
}
// Yeni kayıt eklemek için
#[derive(Insertable, SqlParams)]
#[table("users")]
pub struct InsertUser {
pub name: String,
pub email: String,
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let conn = Connection::open("test.db")?;
let insert_user = InsertUser {
name: "Ali".to_string(),
email: "ali@example.com".to_string(),
};
let id = insert(&conn, insert_user)?;
println!("Eklenen kayıt ID: {}", id);
let get_user = GetUser::new(id);
let user = fetch(&conn, get_user)?;
println!("Kullanıcı: {:?}", user);
Ok(())
}
use parsql::prelude::*;
use deadpool_postgres::{Config, Runtime};
#[derive(Queryable, FromRow, SqlParams, Debug)]
#[table("users")]
#[where_clause("id = $")]
pub struct GetUser {
pub id: i64,
pub name: String,
pub email: String,
}
#[derive(Insertable, SqlParams)]
#[table("users")]
pub struct InsertUser {
pub name: String,
pub email: String,
}
#[derive(Updateable, SqlParams)]
#[table("users")]
#[update("name, email")]
#[where_clause("id = $")]
pub struct UpdateUser {
pub id: i64,
pub name: String,
pub email: String,
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Bağlantı havuzu oluşturma
let mut cfg = Config::new();
cfg.host = Some("localhost".to_string());
cfg.user = Some("postgres".to_string());
cfg.password = Some("postgres".to_string());
cfg.dbname = Some("test".to_string());
let pool = cfg.create_pool(Some(Runtime::Tokio1), NoTls)?;
// Extension method kullanarak kayıt ekleme
let insert_user = InsertUser {
name: "Ali".to_string(),
email: "ali@example.com".to_string(),
};
let rows_affected = pool.insert(insert_user).await?;
println!("Eklenen kayıt sayısı: {}", rows_affected);
// Transaction kullanımı
let client = pool.get().await?;
let tx = client.transaction().await?;
// Transaction içinde extension method kullanarak güncelleme
let update_user = UpdateUser {
id: 1,
name: "Ali Güncellendi".to_string(),
email: "ali.updated@example.com".to_string(),
};
let rows_affected = tx.update(update_user).await?;
// Başarılı olursa commit
tx.commit().await?;
Ok(())
}
get_all yerine sayfalama (limit ve offset) kullanınParsql, basit ve tip güvenli bir migrasyon sistemi içerir:
use parsql::prelude::*;
// Migration tanımlama
pub struct CreateUsersTable;
impl Migration for CreateUsersTable {
fn version(&self) -> i64 { 20240101120000 }
fn name(&self) -> &str { "create_users_table" }
fn up(&self, conn: &mut dyn MigrationConnection) -> Result<()> {
conn.execute("CREATE TABLE users (id SERIAL PRIMARY KEY, email VARCHAR(255))")
}
fn down(&self, conn: &mut dyn MigrationConnection) -> Result<()> {
conn.execute("DROP TABLE users")
}
}
// Migration çalıştırma
let mut runner = MigrationRunner::new();
runner.add_migration(Box::new(CreateUsersTable));
runner.run(&mut conn)?;
Parsql CLI ile migration yönetimi kolaylaşır:
# Kurulum
cargo install parsql-cli
# Proje başlatma
parsql init
# Migration oluşturma
parsql migrate create "create users table"
# Migration çalıştırma
parsql migrate run
# Durum kontrolü
parsql migrate status --detailed
# Geri alma
parsql migrate rollback --to 20240101000000
Her veritabanı adaptörü için daha detaylı bilgi ve örnekler, ilgili alt paketlerin README dosyalarında bulunmaktadır:
Bu proje MIT lisansı altında lisanslanmıştır.