繁体   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