diff --git a/src/rust/liblektor-rs/Cargo.toml b/src/rust/liblektor-rs/Cargo.toml
index 7e9d12c79edd258b45790c32e2433e751ad17049..16435bdb492da2aa3ebe401c2a36ab4ecd016dda 100644
--- a/src/rust/liblektor-rs/Cargo.toml
+++ b/src/rust/liblektor-rs/Cargo.toml
@@ -7,5 +7,7 @@ edition = "2021"
 crate-type = [ "staticlib" ]
 
 [dependencies]
-libc   = "0.2.0"
-diesel = { version = "2", default-features = false, features = [ "sqlite" ] }
+log               = "0.4"
+libc              = "0.2.0"
+diesel_migrations = "2"
+diesel            = { version = "2", default-features = false, features = [ "sqlite" ] }
diff --git a/src/rust/liblektor-rs/src/database/mod.rs b/src/rust/liblektor-rs/src/database/mod.rs
index 8ea4ab3902e2f6c320f130e737e122c51cdeb9af..bf76fec285ed459045d8fab32af764b3b0a3a3b4 100644
--- a/src/rust/liblektor-rs/src/database/mod.rs
+++ b/src/rust/liblektor-rs/src/database/mod.rs
@@ -1,4 +1,24 @@
 pub(self) use diesel::prelude::*;
+use diesel_migrations::{embed_migrations, EmbeddedMigrations, MigrationHarness};
+pub(self) use log::*;
 
 pub mod models;
 pub mod schema;
+
+/// The migrations!
+const MIGRATIONS: EmbeddedMigrations = embed_migrations!();
+
+/// Run migrations in a connexion!
+fn run_migration(conn: &mut SqliteConnection) -> Result<(), String> {
+    conn.run_pending_migrations(MIGRATIONS)
+        .map_err(|err| err.to_string())
+        .map(|_| ())
+}
+
+/// Create a connexion to a database and run automatically the migrations.
+pub fn establish_connection(path: impl AsRef<str>) -> Result<SqliteConnection, String> {
+    let mut conn = SqliteConnection::establish(path.as_ref())
+        .map_err(|err| format!("error connecting to {}: {}", path.as_ref(), err))?;
+    self::run_migration(&mut conn)?;
+    Ok(conn)
+}