[英]Encapsulate a postgresql Transaction in a structure
我正在嘗試封裝 Postgresql 事務,但遇到了一些生命周期問題。
這是代碼: 代碼
我理解錯誤消息:“返回引用當前函數擁有的數據的值”
但我不知道如何將我的“事務”保留在我的 SQLConnection 結構中。
use postgres::{Client, NoTls, Transaction};
pub struct SQLConnection<'a> {
client: Client,
transaction: Transaction<'a>,
}
impl<'a> SQLConnection<'a> {
pub fn new(connect_string: &str) -> Self {
let mut client = Client::connect(connect_string, NoTls).unwrap();
let transaction = client.transaction().unwrap();
Self {
client,
transaction,
}
}
pub fn commit(&self) {
let _ = self.transaction.commit();
}
pub fn rollback(&self) {
let _ = self.transaction.rollback();
}
}
您正在返回對您不保留的值的引用。 如果沒有自有價值,您將無法獲得參考。
在您的情況下,也沒有理由同時保留客戶和交易。 您的連接應該包含client
而不是transaction
,它是一個短暫的 object,不應僅用於操作。
因此,您的連接應該是
pub struct SQLConnection {
client : Client,
}
然后,對於一個操作,您應該獲取一個transaction
,使用它,然后在保持連接的同時刪除它。
我找到了適合我需要的解決方案。 我現在有 SQLConnection 和 SQLTransaction,我從我的連接中獲得了 SQLTransation。 現在我可以使用我的事務來分組我的基本 sql 操作。
這是代碼:
use postgres::{Client, NoTls, Transaction};
pub struct SQLConnection {
client: Client,
}
impl SQLConnection {
pub fn new(connect_string: &str) -> Self {
let client = Client::connect(connect_string, NoTls).unwrap();
Self { client }
}
pub fn transaction(&mut self) -> SQLTransaction {
let t = self.client.transaction().unwrap();
SQLTransaction { transaction: t }
}
}
pub struct SQLTransaction<'a> {
transaction: Transaction<'a>,
}
impl<'a> SQLTransaction<'a> {
pub fn new(transaction: Transaction<'a>) -> Self {
Self { transaction }
}
pub fn commit(self) {
let _ = self.transaction.commit();
}
pub fn rollback(self) {
let _ = self.transaction.rollback();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.