簡體   English   中英

將 postgresql 事務封裝在一個結構中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM