SQL
Plugin providing an interface for the frontend to communicate with SQL databases through sqlx. It supports the SQLite, MySQL and PostgreSQL drivers, enabled by a Cargo feature.
This plugin requires a Rust version of at least 1.77.2
| Platform | Level | Notes |
|---|---|---|
| windows | ||
| linux | ||
| macos | ||
| android | ||
| ios |
Install the SQL plugin to get started.
Use your project’s package manager to add the dependency:
npm run tauri add sqlyarn run tauri add sqlpnpm tauri add sqldeno task tauri add sqlbun tauri add sqlcargo tauri add sql-
Run the following command in the
src-taurifolder to add the plugin to the project’s dependencies inCargo.toml:cargo add tauri-plugin-sql -
Modify
lib.rsto initialize the plugin:src-tauri/src/lib.rs #[cfg_attr(mobile, tauri::mobile_entry_point)]pub fn run() {tauri::Builder::default().plugin(tauri_plugin_sql::Builder::default().build()).run(tauri::generate_context!()).expect("error while running tauri application");} -
Install the JavaScript Guest bindings using your preferred JavaScript package manager:
npm install @tauri-apps/plugin-sqlyarn add @tauri-apps/plugin-sqlpnpm add @tauri-apps/plugin-sqldeno add npm:@tauri-apps/plugin-sqlbun add @tauri-apps/plugin-sql
After installing the plugin, you must select the supported database engine.
The available engines are Sqlite, MySQL and PostgreSQL.
Run the following command in the src-tauri folder to enable your preferred engine:
cargo add tauri-plugin-sql --features sqlitecargo add tauri-plugin-sql --features mysqlcargo add tauri-plugin-sql --features postgresAll the plugin’s APIs are available through the JavaScript guest bindings:
The path is relative to tauri::api::path::BaseDirectory::AppConfig.
import Database from '@tauri-apps/plugin-sql';// when using `"withGlobalTauri": true`, you may use// const Database = window.__TAURI__.sql;
const db = await Database.load('sqlite:test.db');await db.execute('INSERT INTO ...');import Database from '@tauri-apps/plugin-sql';// when using `"withGlobalTauri": true`, you may use// const Database = window.__TAURI__.sql;
const db = await Database.load('mysql://user:password@host/test');await db.execute('INSERT INTO ...');import Database from '@tauri-apps/plugin-sql';// when using `"withGlobalTauri": true`, you may use// const Database = window.__TAURI__.sql;
const db = await Database.load('postgres://user:password@host/test');await db.execute('INSERT INTO ...');We use sqlx as the underlying library and adopt their query syntax.
Use the ”$#” syntax when substituting query data
const result = await db.execute( "INSERT into todos (id, title, status) VALUES ($1, $2, $3)", [todos.id, todos.title, todos.status],);
const result = await db.execute("UPDATE todos SET title = $1, status = $2 WHERE id = $3",[todos.title, todos.status, todos.id],);Use ”?” when substituting query data
const result = await db.execute( "INSERT into todos (id, title, status) VALUES (?, ?, ?)", [todos.id, todos.title, todos.status],);
const result = await db.execute( "UPDATE todos SET title = ?, status = ? WHERE id = ?", [todos.title, todos.status, todos.id],);Use the ”$#” syntax when substituting query data
const result = await db.execute( "INSERT into todos (id, title, status) VALUES ($1, $2, $3)", [todos.id, todos.title, todos.status],);
const result = await db.execute("UPDATE todos SET title = $1, status = $2 WHERE id = $3",[todos.title, todos.status, todos.id],);This plugin supports database migrations, allowing you to manage database schema evolution over time.
Migrations are defined in Rust using the Migration struct. Each migration should include a unique version number, a description, the SQL to be executed, and the type of migration (Up or Down).
Example of a migration:
use tauri_plugin_sql::{Migration, MigrationKind};
let migration = Migration { version: 1, description: "create_initial_tables", sql: "CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT);", kind: MigrationKind::Up,};Or if you want to use SQL from a file, you can include it by using include_str!:
use tauri_plugin_sql::{Migration, MigrationKind};
let migration = Migration { version: 1, description: "create_initial_tables", sql: include_str!("../drizzle/0000_graceful_boomer.sql"), kind: MigrationKind::Up,};Migrations are registered with the Builder struct provided by the plugin. Use the add_migrations method to add your migrations to the plugin for a specific database connection.
Example of adding migrations:
use tauri_plugin_sql::{Builder, Migration, MigrationKind};
fn main() { let migrations = vec![ // Define your migrations here Migration { version: 1, description: "create_initial_tables", sql: "CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT);", kind: MigrationKind::Up, } ];
tauri::Builder::default() .plugin( tauri_plugin_sql::Builder::default() .add_migrations("sqlite:mydatabase.db", migrations) .build(), ) ...}To apply the migrations when the plugin is initialized, add the connection string to the tauri.conf.json file:
{ "plugins": { "sql": { "preload": ["sqlite:mydatabase.db"] } }}Alternatively, the client side load() also runs the migrations for a given connection string:
import Database from '@tauri-apps/plugin-sql';const db = await Database.load('sqlite:mydatabase.db');Ensure that the migrations are defined in the correct order and are safe to run multiple times.
- Version Control: Each migration must have a unique version number. This is crucial for ensuring the migrations are applied in the correct order.
- Idempotency: Write migrations in a way that they can be safely re-run without causing errors or unintended consequences.
- Testing: Thoroughly test migrations to ensure they work as expected and do not compromise the integrity of your database.
By default all potentially dangerous plugin commands and scopes are blocked and cannot be accessed. You must modify the permissions in your capabilities configuration to enable these.
See the Capabilities Overview for more information and the step by step guide to use plugin permissions.
{ "permissions": [ ..., "sql:default", "sql:allow-execute", ]}Default Permission
Default Permissions
This permission set configures what kind of database operations are available from the sql plugin.
Granted Permissions
All reading related operations are enabled. Also allows to load or close a connection.
This default permission set includes the following:
allow-closeallow-loadallow-select
Permission Table
| Identifier | Description |
|---|---|
|
|
Enables the close command without any pre-configured scope. |
|
|
Denies the close command without any pre-configured scope. |
|
|
Enables the execute command without any pre-configured scope. |
|
|
Denies the execute command without any pre-configured scope. |
|
|
Enables the load command without any pre-configured scope. |
|
|
Denies the load command without any pre-configured scope. |
|
|
Enables the select command without any pre-configured scope. |
|
|
Denies the select command without any pre-configured scope. |
© 2025 Tauri Contributors. CC-BY / MIT