feat: teach sqlx-cli about migrate.table-name

This commit is contained in:
Austin Bonander
2025-01-22 14:24:18 -08:00
parent 1ff6a8a950
commit 45c0b85b4c
10 changed files with 172 additions and 151 deletions

View File

@@ -64,12 +64,11 @@ impl MigrateDatabase for Sqlite {
}
impl Migrate for SqliteConnection {
fn ensure_migrations_table(&mut self) -> BoxFuture<'_, Result<(), MigrateError>> {
fn ensure_migrations_table<'e>(&'e mut self, table_name: &'e str) -> BoxFuture<'e, Result<(), MigrateError>> {
Box::pin(async move {
// language=SQLite
self.execute(
r#"
CREATE TABLE IF NOT EXISTS _sqlx_migrations (
self.execute(&*format!(r#"
CREATE TABLE IF NOT EXISTS {table_name} (
version BIGINT PRIMARY KEY,
description TEXT NOT NULL,
installed_on TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
@@ -77,19 +76,19 @@ CREATE TABLE IF NOT EXISTS _sqlx_migrations (
checksum BLOB NOT NULL,
execution_time BIGINT NOT NULL
);
"#,
"#),
)
.await?;
.await?;
Ok(())
})
}
fn dirty_version(&mut self) -> BoxFuture<'_, Result<Option<i64>, MigrateError>> {
fn dirty_version<'e>(&'e mut self, table_name: &'e str) -> BoxFuture<'e, Result<Option<i64>, MigrateError>> {
Box::pin(async move {
// language=SQLite
let row: Option<(i64,)> = query_as(
"SELECT version FROM _sqlx_migrations WHERE success = false ORDER BY version LIMIT 1",
&format!("SELECT version FROM {table_name} WHERE success = false ORDER BY version LIMIT 1"),
)
.fetch_optional(self)
.await?;
@@ -98,13 +97,11 @@ CREATE TABLE IF NOT EXISTS _sqlx_migrations (
})
}
fn list_applied_migrations(
&mut self,
) -> BoxFuture<'_, Result<Vec<AppliedMigration>, MigrateError>> {
fn list_applied_migrations<'e>(&'e mut self, table_name: &'e str) -> BoxFuture<'e, Result<Vec<AppliedMigration>, MigrateError>> {
Box::pin(async move {
// language=SQLite
let rows: Vec<(i64, Vec<u8>)> =
query_as("SELECT version, checksum FROM _sqlx_migrations ORDER BY version")
query_as(&format!("SELECT version, checksum FROM {table_name} ORDER BY version"))
.fetch_all(self)
.await?;
@@ -128,10 +125,11 @@ CREATE TABLE IF NOT EXISTS _sqlx_migrations (
Box::pin(async move { Ok(()) })
}
fn apply<'e: 'm, 'm>(
fn apply<'e>(
&'e mut self,
migration: &'m Migration,
) -> BoxFuture<'m, Result<Duration, MigrateError>> {
table_name: &'e str,
migration: &'e Migration,
) -> BoxFuture<'e, Result<Duration, MigrateError>> {
Box::pin(async move {
let mut tx = self.begin().await?;
let start = Instant::now();
@@ -148,10 +146,10 @@ CREATE TABLE IF NOT EXISTS _sqlx_migrations (
// language=SQL
let _ = query(
r#"
INSERT INTO _sqlx_migrations ( version, description, success, checksum, execution_time )
&format!(r#"
INSERT INTO {table_name} ( version, description, success, checksum, execution_time )
VALUES ( ?1, ?2, TRUE, ?3, -1 )
"#,
"#),
)
.bind(migration.version)
.bind(&*migration.description)
@@ -170,11 +168,11 @@ CREATE TABLE IF NOT EXISTS _sqlx_migrations (
// language=SQL
#[allow(clippy::cast_possible_truncation)]
let _ = query(
r#"
UPDATE _sqlx_migrations
&format!(r#"
UPDATE {table_name}
SET execution_time = ?1
WHERE version = ?2
"#,
"#),
)
.bind(elapsed.as_nanos() as i64)
.bind(migration.version)
@@ -185,10 +183,11 @@ CREATE TABLE IF NOT EXISTS _sqlx_migrations (
})
}
fn revert<'e: 'm, 'm>(
fn revert<'e>(
&'e mut self,
migration: &'m Migration,
) -> BoxFuture<'m, Result<Duration, MigrateError>> {
table_name: &'e str,
migration: &'e Migration,
) -> BoxFuture<'e, Result<Duration, MigrateError>> {
Box::pin(async move {
// Use a single transaction for the actual migration script and the essential bookeeping so we never
// execute migrations twice. See https://github.com/launchbadge/sqlx/issues/1966.
@@ -197,8 +196,8 @@ CREATE TABLE IF NOT EXISTS _sqlx_migrations (
let _ = tx.execute(&*migration.sql).await?;
// language=SQL
let _ = query(r#"DELETE FROM _sqlx_migrations WHERE version = ?1"#)
// language=SQLite
let _ = query(&format!(r#"DELETE FROM {table_name} WHERE version = ?1"#))
.bind(migration.version)
.execute(&mut *tx)
.await?;