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