我目前正在开发一个应用程序,其中前端需要与PostgreSQL数据库进行通信。我使用postgres
包在Rust端完成PostgreSQL工作。
由于我在这里使用的是Tauri,所以我构建了命令来创建连接,并在用户请求时将数据传递给用户。
我这里的问题是,我不能在命令之间共享PostgreSQL客户端。我知道有某种tauri::State
,但它不能处理客户端。
有没有办法在多个命令之间共享postgres::Client
示例?
我现在的代码看起来像这样:
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
use postgres::Client;
struct ClientState(Option<Client>);
#[tauri::command]
fn connect(client_state: tauri::State<ClientState>) { ... }
fn main() {
tauri::Builder::default()
.manage(ClientState(None))
.invoke_handler(tauri::generate_handler![connect])
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
字符串
我希望代码共享客户端的示例
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
use postgres::Client;
struct ClientState(Option<Client>);
#[tauri::command]
fn connect(client_state: tauri::State<ClientState>) {
// initialize the client
}
#[tauri::command]
fn exists_user(id: &str, client_state: tauri::State<ClientState>) -> bool {
// check if a user with the given id exists for example
}
fn main() {
tauri::Builder::default()
.manage(ClientState(None))
.invoke_handler(tauri::generate_handler![connect, exists_user])
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
型
1条答案
按热度按时间mwngjboj1#
希望我对你的用例来说还不算太晚。我正在构建和你完全相同的模式,我遇到了同样的问题。我最终确实使用了
tauri::State
。首先,我最初的应用程序使用了
sqlx::PgConnection
和一堆xmlc的东西,但我用postgres
进行了测试,它实际上应该更简单。经过多次尝试和错误,我现在示例化我的全局结构体如下:
字符串
然后,你可以像这样使用你的客户端:
型
当然,如果没有初始化,这是行不通的。我更喜欢在启动时不初始化连接,而是使用一个单独的函数来完成。
我使用
core::default
来设置.manage()
中的默认值,这些值永远不会被使用,但对于继续初始化很有用:型
然后在一个函数中,这实际上是另一个tauri命令:
型
我在我的应用程序中写了这些,看看它是否能正常工作,它是否能正确连接,但我没有测试任何实际的sql。你可以看看我的应用程序here,以获得进一步的灵感。