{"id":22350672,"url":"https://github.com/iamsauravsharma/sqlx_migrator","last_synced_at":"2025-10-08T08:56:58.214Z","repository":{"id":40267374,"uuid":"483511125","full_name":"iamsauravsharma/sqlx_migrator","owner":"iamsauravsharma","description":"SQLX migration using Rust insted of SQL","archived":false,"fork":false,"pushed_at":"2025-10-04T02:57:37.000Z","size":5187,"stargazers_count":37,"open_issues_count":1,"forks_count":4,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-04T04:13:18.195Z","etag":null,"topics":["database","hacktoberfest","migration","rust","sqlx"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/iamsauravsharma.png","metadata":{"files":{"readme":"README.MD","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-04-20T04:51:39.000Z","updated_at":"2025-10-04T02:57:40.000Z","dependencies_parsed_at":"2023-11-18T04:27:06.797Z","dependency_job_id":"d1de3a47-c969-47eb-ad31-2f417a9770b3","html_url":"https://github.com/iamsauravsharma/sqlx_migrator","commit_stats":{"total_commits":112,"total_committers":3,"mean_commits":"37.333333333333336","dds":0.0714285714285714,"last_synced_commit":"17c83014caad1be78932bc9d59c9091bb104276a"},"previous_names":[],"tags_count":33,"template":false,"template_full_name":null,"purl":"pkg:github/iamsauravsharma/sqlx_migrator","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iamsauravsharma%2Fsqlx_migrator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iamsauravsharma%2Fsqlx_migrator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iamsauravsharma%2Fsqlx_migrator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iamsauravsharma%2Fsqlx_migrator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/iamsauravsharma","download_url":"https://codeload.github.com/iamsauravsharma/sqlx_migrator/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iamsauravsharma%2Fsqlx_migrator/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278916432,"owners_count":26068090,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-08T02:00:06.501Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["database","hacktoberfest","migration","rust","sqlx"],"created_at":"2024-12-04T11:12:45.539Z","updated_at":"2025-10-08T08:56:58.208Z","avatar_url":"https://github.com/iamsauravsharma.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SQLX migrator\n\nA Rust library for writing SQLX migrations using Rust instead of SQL.\n\n|                    License                     |              Crates Version               |                 Docs                 |\n| :--------------------------------------------: | :---------------------------------------: | :----------------------------------: |\n| [![License: MIT][license_badge]][license_link] | [![Crate][cratesio_badge]][cratesio_link] | [![Docs][docsrs_badge]][docsrs_link] |\n\nSupported Databases:\n\n- [x] PostgreSQL\n- [x] SQLite\n- [x] MySql\n- [x] Any\n\n## Installation\n\nAdd `sqlx_migrator` to your `Cargo.toml` with the appropriate database feature:\n\n```toml\nsqlx_migrator = { version = \"0.18.0\", features=[\"postgres\"] }\n```\n\nOR\n\n```toml\nsqlx_migrator = { version = \"0.18.0\", features=[\"mysql\"] }\n```\n\nOR\n\n```toml\nsqlx_migrator = { version = \"0.18.0\", features=[\"sqlite\"] }\n```\n\nOR\n\n```toml\nsqlx_migrator = { version = \"0.18.0\", features=[\n    \"any\",\n    # Plus any one of above database driver\n    ] }\n```\n\n# Usage\n\nTo use `sqlx_migrator`, implement the `Operation` trait to define your migration logic. Here's an example using PostgreSQL:\n\n```rust\nuse sqlx_migrator::error::Error;\nuse sqlx_migrator::operation::Operation;\n\npub(crate) struct FirstOperation;\n\n#[async_trait::async_trait]\nimpl Operation\u003csqlx::Postgres\u003e for FirstOperation {\n    // Up function runs apply migration\n    async fn up(\u0026self, connection: \u0026mut sqlx::PgConnection) -\u003e Result\u003c(), Error\u003e {\n        sqlx::query(\"CREATE TABLE sample (id INTEGER PRIMARY KEY, name TEXT)\")\n            // NOTE: if you want to use connection multiple times pass `\u0026mut *connection`\n            // as a parameter instead of `connection`\n            .execute(connection)\n            .await?;\n        Ok(())\n    }\n\n    // down migration runs down migration\n    async fn down(\u0026self, connection: \u0026mut sqlx::PgConnection) -\u003e Result\u003c(), Error\u003e {\n        sqlx::query(\"DROP TABLE sample\").execute(connection).await?;\n        Ok(())\n    }\n}\n```\nAfter defining your operations, you can create a migration:\n\n```rust\nuse sqlx_migrator::error::Error;\nuse sqlx_migrator::migration::Migration;\nuse sqlx_migrator::operation::Operation;\n\npub(crate) struct FirstMigration;\n\nimpl Migration\u003csqlx::Postgres\u003e for FirstMigration {\n    // app where migration lies can be any value\n    fn app(\u0026self) -\u003e \u0026str {\n        \"main\"\n    }\n\n    // name of migration\n    // Combination of migration app and name must be unique to work properly expects for virtual migration\n    fn name(\u0026self) -\u003e \u0026str {\n        \"first_migration\"\n    }\n\n    // Use the parent function to add parents of a migration.\n    // If you cannot access or create the parent migration easily, you can also use\n    // `(A,N) where A: AsRef\u003cstr\u003e, N: AsRef\u003cstr\u003e` where A is the app name\n    // and N is the name of the migration.\n    fn parents(\u0026self) -\u003e Vec\u003cBox\u003cdyn Migration\u003csqlx::Postgres\u003e\u003e\u003e {\n        vec![]\n        // vec![(\"main\", \"initial_migration\"), AnotherInitialMigration]\n    }\n\n    // use operations function to add operation part of migration\n    fn operations(\u0026self) -\u003e Vec\u003cBox\u003cdyn Operation\u003csqlx::Postgres\u003e\u003e\u003e {\n        vec![Box::new(FirstOperation)]\n    }\n\n    // Migration trait also have multiple other function see docs for usage\n}\n```\n\nThis migration can be represented in a simpler form using macros:\n```rust\nuse sqlx_migrator::vec_box;\nsqlx_migrator::migration!(\n    sqlx::Postgres,\n    FirstMigration,\n    \"main\",\n    \"first_migration\",\n    vec_box![], \n    vec_box![FirstOperation]\n);\n// OR\nsqlx_migrator::postgres_migration!(\n    FirstMigration,\n    \"main\",\n    \"first_migration\",\n    vec_box![], \n    vec_box![FirstOperation]\n);\n```\n\nIf your up and down queries are simple strings, you can simplify the implementation:\n```rust\nsqlx_migrator::postgres_migration!(\n    FirstMigration,\n    \"main\",\n    \"first_migration\",\n    sqlx_migrator::vec_box![],\n    sqlx_migrator::vec_box![\n        (\n            \"CREATE TABLE sample (id INTEGER PRIMARY KEY, name TEXT)\",\n            \"DROP TABLE sample\"\n        )\n    ]\n);\n```\n\nFinally, create a migrator to run your migrations:\n\n```rust\nuse sqlx_migrator::migrator::{Info, Migrate, Migrator};\nuse sqlx::Postgres;\n\n#[tokio::main]\nasync fn main() {\n    let uri = std::env::var(\"DATABASE_URL\").unwrap();\n    let pool = sqlx::Pool::\u003cPostgres\u003e::connect(\u0026uri).await.unwrap();\n    let mut migrator = Migrator::default();\n    // Adding migration can fail if another migration with same app and name and different values gets added\n    // Adding migrations add its parents, replaces and run before as well\n    migrator.add_migration(Box::new(FirstMigration)).unwrap();\n}\n```\n\n# Running Migrations\n\nYou can run migrations directly or integrate them into a CLI:\n## Programmatic Execution\n```rust\nuse sqlx_migrator::migrator::Plan;\nlet mut conn = pool.acquire().await?;\n// use apply all to apply all pending migration\nmigrator.run(\u0026mut *conn, Plan::apply_all()).await.unwrap();\n// or use revert all to revert all applied migrations\nmigrator.run(\u0026mut *conn, Plan::revert_all()).await.unwrap();\n// If you need to apply or revert to certain stage than see `Plan` docs\n```\n\n## CLI Integration\nTo integrate sqlx_migrator into your CLI, you can either use the built-in\n`MigrationCommand` or extend your own CLI with migrator support. Below are\nexamples of both approaches:\n\n#### Built-in Migration Command\n\n```rust\nuse sqlx_migrator::cli::MigrationCommand;\n\nMigrationCommand::parse_and_run(\u0026mut *conn, Box::new(migrator)).await.unwrap();\n```\n\n#### Extending Your Own CLI with Migrator Support\n\n```rust\n#[derive(clap::Parser)]\nstruct Cli {\n    #[command(subcommand)]\n    sub_command: CliSubcommand\n}\n\n#[derive(clap::Subcommand)]\nenum CliSubcommand {\n    Migrator(sqlx_migrator::cli::MigrationCommand)\n}\n\nimpl Cli {\n    async fn run() {\n        let cli = Self::parse();\n        // create connection\n        match cli.sub_command {\n            Migrator(m) =\u003e {\n                m.run(\u0026mut conn, Box::new(migrator)).await.unwrap()\n            }\n        }\n    }\n}\n```\n\n# Migrate from old migrator migration to `sqlx_migrator` migration\n\nTo transition from your old migration system to `sqlx_migrator`, follow these steps:\n\n### 1. Create Corresponding Migrations\nFor each migration in your old system, create an equivalent migration in `sqlx_migrator` format. This ensures all historical migrations are properly represented in the new system.\n\n### 2. Implement the OldMigrator Trait\nThe `OldMigrator` trait allows you to bridge between your old migration system and `sqlx_migrator`. Here's a implementation example for sqlx sql:\n\n```rust\nuse sqlx_migrator::sync::OldMigator;\nuse sqlx::Database\n\nstruct SqlxMigrator;\n\n#[async_trait::async_trait]\nimpl\u003cDB, T\u003e OldMigrator\u003cDB\u003e for SqlxMigrator\n    DB: Database,\n{\n    async fn applied_migrations(\n        \u0026self,\n        connection: \u0026mut \u003cDB as Database\u003e::Connection,\n    ) -\u003e Result\u003cVec\u003cBox\u003cdyn Migration\u003cDB\u003e\u003e\u003e, Error\u003e {\n        let old_migrations = sqlx::query!(\n            \"SELECT version, description FROM _sqlx_migrations ORDER BY version\"\n        )\n        .fetch_all(connection)\n        .await?;\n        let mut migrations = vec![];\n        // your custom logic here to map from old migrator to new migration\n        // for example for sqlx you may use a migration name as combination of both version\n        // and description or only one between them it is your choice\n        // and sqlx migrator have no preference between them\n        Ok(migrations)\n    }\n}\n```\n\n### 3. Run sync\nBefore running your main migration code, execute the sync operation\n\n```rust\nuse sqlx_migrator::Synchronize;\n\nlet sqlx_sql_migrator = SqlxMigrator;\nmigrator.sync(\u0026mut *conn, \u0026sqlx_sql_migrator).await?;\n```\n\nYou can also implement above functionality for other migrator such as `diesel`, `seaorm` etc as well as for renaming table name of `sqlx_migrator`\n\n[license_badge]: https://img.shields.io/github/license/iamsauravsharma/sqlx_migrator.svg?style=for-the-badge\n[license_link]: LICENSE\n[cratesio_badge]: https://img.shields.io/crates/v/sqlx_migrator.svg?style=for-the-badge\n[cratesio_link]: https://crates.io/crates/sqlx_migrator\n[docsrs_badge]: https://img.shields.io/docsrs/sqlx_migrator/latest?style=for-the-badge\n[docsrs_link]: https://docs.rs/sqlx_migrator\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiamsauravsharma%2Fsqlx_migrator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fiamsauravsharma%2Fsqlx_migrator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiamsauravsharma%2Fsqlx_migrator/lists"}