postgresql Tauri和共享postgres示例

gcxthw6b  于 2024-01-07  发布在  PostgreSQL
关注(0)|答案(1)|浏览(268)

我目前正在开发一个应用程序,其中前端需要与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");
}

mwngjboj

mwngjboj1#

希望我对你的用例来说还不算太晚。我正在构建和你完全相同的模式,我遇到了同样的问题。我最终确实使用了tauri::State
首先,我最初的应用程序使用了sqlx::PgConnection和一堆xmlc的东西,但我用postgres进行了测试,它实际上应该更简单。
经过多次尝试和错误,我现在示例化我的全局结构体如下:

struct DbConnection {
    client: Mutex<Option<Client>>
}

字符串
然后,你可以像这样使用你的客户端:

#[tauri::command]
fn exec(
    connection: State<DbConnection>,
    sql: &str
) -> u64 {
    let mut binding = connection.client.lock().unwrap();
    let client = binding.as_mut().unwrap();
    // You can start using your `postgres::Client` here
    let result = client.execute(sql, &[]).unwrap();
    return result;


当然,如果没有初始化,这是行不通的。我更喜欢在启动时不初始化连接,而是使用一个单独的函数来完成。
我使用core::default来设置.manage()中的默认值,这些值永远不会被使用,但对于继续初始化很有用:

tauri::Builder::default()
        .manage(DbConnection {
            client: Default::default()
        })
        ...


然后在一个函数中,这实际上是另一个tauri命令:

#[tauri::command]
fn init(connection: State<DbConnection>) -> Result<(), String> {
    *connection.client.lock().unwrap() = Some(Client::connect("host=localhost user=postgres", NoTls).unwrap());
}


我在我的应用程序中写了这些,看看它是否能正常工作,它是否能正确连接,但我没有测试任何实际的sql。你可以看看我的应用程序here,以获得进一步的灵感。

相关问题