{"id":13629098,"url":"https://github.com/Odonno/surrealdb-migrations","last_synced_at":"2025-04-17T04:33:02.939Z","repository":{"id":152242919,"uuid":"615025766","full_name":"Odonno/surrealdb-migrations","owner":"Odonno","description":"An awesome SurrealDB migration tool, with a user-friendly CLI and a versatile Rust library that enables seamless integration into any project.","archived":false,"fork":false,"pushed_at":"2025-04-04T10:10:31.000Z","size":669,"stargazers_count":259,"open_issues_count":21,"forks_count":21,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-04-06T11:46:59.472Z","etag":null,"topics":["crates","events","migrations","migrations-generator","rust","schema","surrealdb"],"latest_commit_sha":null,"homepage":"https://crates.io/crates/surrealdb-migrations","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/Odonno.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":"contributing.md","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}},"created_at":"2023-03-16T19:55:02.000Z","updated_at":"2025-04-05T12:56:29.000Z","dependencies_parsed_at":"2023-04-25T12:25:58.932Z","dependency_job_id":"e323b7a8-ab58-426e-b2ac-903c59f752e7","html_url":"https://github.com/Odonno/surrealdb-migrations","commit_stats":null,"previous_names":[],"tags_count":33,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Odonno%2Fsurrealdb-migrations","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Odonno%2Fsurrealdb-migrations/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Odonno%2Fsurrealdb-migrations/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Odonno%2Fsurrealdb-migrations/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Odonno","download_url":"https://codeload.github.com/Odonno/surrealdb-migrations/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249316049,"owners_count":21249883,"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","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":["crates","events","migrations","migrations-generator","rust","schema","surrealdb"],"created_at":"2024-08-01T22:01:02.541Z","updated_at":"2025-04-17T04:33:01.193Z","avatar_url":"https://github.com/Odonno.png","language":"Rust","funding_links":[],"categories":["Libraries"],"sub_categories":[],"readme":"![Crates.io](https://img.shields.io/crates/v/surrealdb-migrations) ![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/Odonno/surrealdb-migrations/main.yml) ![GitHub](https://img.shields.io/github/license/Odonno/surrealdb-migrations) [![codecov](https://codecov.io/gh/Odonno/surrealdb-migrations/branch/main/graph/badge.svg?token=8DCQY63QP9)](https://codecov.io/gh/Odonno/surrealdb-migrations)\n\n# SurrealDB Migrations\n\nAn awesome SurrealDB migration tool, with a user-friendly CLI and a versatile Rust library that enables seamless integration into any project.\n\n\u003e **Warning**\n\u003e This project is not production-ready, use at your own risk.\n\nThis project can be used:\n\n- as a Rust library\n\n```bash\ncargo add surrealdb-migrations\n```\n\n- or as a CLI\n\n```bash\ncargo install surrealdb-migrations\n```\n\n- or inside a CI workflow, using a [GitHub Action](https://github.com/marketplace/actions/surrealdb-migrations)\n\nCheck [surrealdb-migrations](https://github.com/marketplace/actions/surrealdb-migrations) GitHub Action in the marketplace\n\n- or even as an `initContainer` via a [Docker image](https://hub.docker.com/r/dbottiau/surrealdb-migrations)\n\n```bash\ndocker pull dbottiau/surrealdb-migrations:latest\n```\n\n## The philosophy\n\nThe SurrealDB Migrations project aims to simplify the creation of a SurrealDB database schema and the evolution of the database through migrations. A typical SurrealDB migration project is divided into 3 categories: schema, event and migration.\n\nA schema file represents no more than one SurrealDB table. The list of schemas can be seen as the Query model (in a CQRS pattern). The `schemas` folder can be seen as a view of the current data model.\n\nAn event file represents no more than one SurrealDB event and the underlying table. The list of events can be seen as the Command model (in a CQRS pattern). The `events` folder can be seen as a view of the different ways to update the data model.\n\nA migration file represents a change in SurrealDB data. It can be a change in the point of time between two schema changes. Examples are: when a column is renamed or dropped, when a table is renamed or dropped, when a new data is required (with default value), etc...\n\n## Get started\n\n```mermaid\nstateDiagram-v2\n    scaffold : Scaffold a project\n    changeSchema : Change schema/event\n    createMigration: Create migration (data changes)\n    apply : Apply to your database\n\n    state fork_state \u003c\u003cfork\u003e\u003e\n        [*] --\u003e scaffold\n        scaffold --\u003e fork_state\n        fork_state --\u003e changeSchema\n        fork_state --\u003e createMigration\n\n    state join_state \u003c\u003cjoin\u003e\u003e\n        changeSchema --\u003e join_state\n        createMigration --\u003e join_state\n        join_state --\u003e apply\n        apply --\u003e fork_state\n```\n\n### 1. Scaffold\n\nYou can start a migration project by scaffolding a new project using the following command line:\n\n```\nsurrealdb-migrations scaffold template empty\n```\n\nThis will create the necessary folders and files in order to perform migrations. The `empty` template should look like this:\n\n- /schemas\n  - script_migration.surql\n- /events\n- /migrations\n\nThere are a number of pre-defined templates so you can play around and get started quickly.\n\n### 2. Change schema and/or create data change migrations\n\nOnce you have created your migration project, you can start writing your own model. Based on the folders you saw earlier, you can create schema files, event files and migration files.\n\n#### Schemas\n\nYou can create strict schema files that represent tables stored in SurrealDB.\n\n```\nsurrealdb-migrations create schema post --fields title,content,author,created_at,status\n```\n\nThis will create a schemaless table with predefined fields:\n\n```surql\nDEFINE TABLE post SCHEMALESS;\n\nDEFINE FIELD title ON post;\nDEFINE FIELD content ON post;\nDEFINE FIELD author ON post;\nDEFINE FIELD created_at ON post;\nDEFINE FIELD status ON post;\n```\n\n#### Events\n\nYou can also create events in the same way.\n\n```\nsurrealdb-migrations create event publish_post --fields post_id,created_at\n```\n\nThis will define a table event with predefined fields:\n\n```surql\nDEFINE TABLE publish_post SCHEMALESS;\n\nDEFINE FIELD post_id ON publish_post;\nDEFINE FIELD created_at ON publish_post;\n\nDEFINE EVENT publish_post ON TABLE publish_post WHEN $event == \"CREATE\" THEN (\n    # TODO\n);\n```\n\n#### Migrations\n\nAnd when updating data, you can create migration files this way:\n\n```\nsurrealdb-migrations create AddAdminUser\n```\n\nThis will create a new file using the current date \u0026 time of the day, like `20230317_153201_AddAdminUser.surql` for example. All migrations files should be listed in a temporal order.\n\n### 3. Apply to your database\n\nFinally, when you are ready, you can apply your schema and migrations to the database using the following command line:\n\n```\nsurrealdb-migrations apply\n```\n\nOr directly inside your Rust project using the following code:\n\n```rust\nuse surrealdb_migrations::MigrationRunner;\nuse surrealdb::engine::any::connect;\nuse surrealdb::opt::auth::Root;\n\n#[tokio::main]\nasync fn main() -\u003e Result\u003c()\u003e {\n    let db = connect(\"ws://localhost:8000\").await?;\n\n    // Signin as a namespace, database, or root user\n    db.signin(Root {\n        username: \"root\",\n        password: \"root\",\n    }).await?;\n\n    // Select a specific namespace / database\n    db.use_ns(\"namespace\").use_db(\"database\").await?;\n\n    // Apply all migrations\n    MigrationRunner::new(\u0026db)\n        .up()\n        .await\n        .expect(\"Failed to apply migrations\");\n\n    Ok(())\n}\n```\n\n### 4. Repeat\n\nRepeat the process from step 2. Change schema and/or create data change migrations.\n\n## Predefined templates\n\nTo help you get started quickly, there is a list of predefined templates you can use:\n\n| Template                         | Description                                                                                                                                           |\n| -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |\n| [empty](templates/empty)         | The smallest migration project you can create.\u003cbr /\u003e A clean schema with an already defined `script_migration` table to store the applied migrations. |\n| [blog](templates/blog)           | A blog domain model, with users having the ability to publish/unpublish posts and comments.                                                           |\n| [ecommerce](templates/ecommerce) | An ecommerce domain model, with customers having the ability to purchase products.                                                                    |\n\nYou can scaffold a project using any of these templates using the following command line:\n\n```\nsurrealdb-migrations scaffold template \u003cTEMPLATE\u003e\n```\n\n## Configuration\n\nYou can create a `.surrealdb` configuration file at the root of your project. This way you won't have to set the same configuration values every time.\n\n```toml\n[core]\n    path = \"./tests-files\"\n    schema = \"less\"\n\n[db]\n    address = \"ws://localhost:8000\"\n    username = \"root\"\n    password = \"root\"\n    ns = \"test\"\n    db = \"test\"\n```\n\nIn the `core` section, you can define the path to your schema/migration files, if it is not the current folder.\n\nIn the `db` section, you can define the values used to access your SurrealDB database. It can be the `url`, `username`, `password`, the namespace `ns` or the name of the database `db`.\n\nHere is the definition of the `.surrealdb` configuration file:\n\n```toml\n[core]\n    # Optional\n    # Type: String\n    # Description: Path to the folder that contains your migration project (root folder by default)\n    # Default: \".\"\n    path\n\n    # Optional\n    # Type: \"less\" | \"full\"\n    # Description: Define SCHEMALESS or SCHEMAFULL option by default when creating new table/event file\n    # Default: \"less\"\n    schema\n\n[db]\n    # Optional\n    # Type: String\n    # Description: Address of the surrealdb instance\n    # Default: \"ws://localhost:8000\"\n    address\n\n    # Optional\n    # Type: String\n    # Description: Username used to authenticate to the surrealdb instance\n    # Default: \"root\"\n    username\n\n    # Optional\n    # Type: String\n    # Description: Password used to authenticate to the surrealdb instance\n    # Default: \"root\"\n    password\n\n    # Optional\n    # Type: String\n    # Description: Namespace to use inside the surrealdb instance\n    # Default: \"test\"\n    ns\n\n    # Optional\n    # Type: String\n    # Description: Name of the database to use inside the surrealdb instance\n    # Default: \"test\"\n    db\n```\n\n## Backward migrations\n\nBy default, migrations are forward-only. However, it can be interesting to revert a migration in order to undo a mistake. You will find backward migrations in two places:\n\n1. Inside the `/migrations/down` folder with the same name as your forward migration\n2. Inside the `/migrations` but with the `.down.surql` extension next to the forward migration\n\nSo, a migration project with backward migrations might look like this:\n\n- /schemas\n  - script_migration.surql\n- /events\n- /migrations\n  - 20231605_205201_AddProduct.surql\n  - /down\n    - 20231605_205201_AddProduct.surql\n\nOr like this:\n\n- /schemas\n  - script_migration.surql\n- /events\n- /migrations\n  - 20231605_205201_AddProduct.surql\n  - 20231605_205201_AddProduct.down.surql\n\nIf you want to create a DOWN migration file when creating the migration file, use this command:\n\n```\nsurrealdb-migrations create AddProduct --down\n```\n\nIf you need to, you can revert all migrations back to the one you specified.\n\n```\nsurrealdb-migrations apply --down 20231605_205201_AddProduct\n```\n\nAnd if you need to undo all your migrations, use this command:\n\n```\nsurrealdb-migrations apply --down 0\n```\n\n## Database branching\n\nDatabase branching is a similar concept to version control system like Git where you manage code repositories with branches.\n\nWith database branching, you can create a separate copy or branch of the main database to perform various tasks such as testing new features, implementing changes, or running experiments. This allows developers or teams to work independently on different branches without interfering with the stability and integrity of the original database.\n\nYou can make make schemas changes, apply new migrations and/or change data on a separate branch. These changes are isolated from the main database until they are merged back, allowing for better control and organization of database changes.\n\n### Development workflow\n\nIn a development workflow, you have a primary/main database that contains the latest features on your project. You often work on multiple features or you want to try the work of your colleagues but it messes up your development database, whether you are using migrations or not. Database branching allows you to create a fork of the main database, work on a new feature, apply schema or data changes and then merge your new changes to the main database when your feature is ready.\n\n```mermaid\nstateDiagram-v2\n    main : Main branch\n    createBranch : Create branch \"feature-1\"\n    makeChanges : Make changes on \"feature-1\"\n    merge : Merge \"feature-1\" on main\n    remove : Remove branch \"feature-1\"\n\n    [*] --\u003e main\n    main --\u003e [*]\n    main --\u003e createBranch\n    createBranch --\u003e makeChanges\n    makeChanges --\u003e remove\n    makeChanges --\u003e merge\n    remove --\u003e [*]\n    merge --\u003e [*]\n```\n\nYou start by creating a new branch using the following command line:\n\n```\nsurrealdb-migrations branch new --address http://localhost:8000\n```\n\nYou will then receive a message like this:\n\n```\nYou can now use the branch with the following configuration:\n\nns: branches\ndb: bright-fold-1617\n```\n\nYou can now make your changes on the newly generated database using `ns` and `db` properties.\nWhen you are done with your changes, you can merge your branch to the origin branch using the following command line:\n\n```\nsurrealdb-migrations branch merge bright-fold-1617 --mode all --address http://localhost:8000\n```\n\nThere are 3 merge modes, each with its own interest:\n\n| Mode        | Description                                                                                                                                                                                                                                                                                                                                                                                                      | Status      |\n| ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- |\n| schema-only | A diff of schema will be applied between the branch and the origin branch at the moment of the branch creation.\u003cbr /\u003e\u003cbr /\u003e If possible, the merge will operate schema changes on the origin branch:\u003cbr /\u003e \\* defining new tables, fields, etc...\u003cbr /\u003e \\* removing tables, fields, etc...                                                                                                                       | Planned     |\n| all         | As an extension to the `schema-only` mode, a diff of schema and data will be applied between the branch and the origin branch at the moment of the branch creation.\u003cbr /\u003e\u003cbr /\u003e If possible, the merge will operate schema and data changes on the origin branch:\u003cbr /\u003e \\* defining new tables, fields, etc...\u003cbr /\u003e \\* removing tables, fields, etc...\u003cbr /\u003e \\* adding, updating or removing table rows/columns | Planned     |\n| overwrite   | Merging the branch will completely destroy the origin branch and replace it with the new one.\u003cbr /\u003e The main branch will have the schema and the data set in the merged branch.                                                                                                                                                                                                                                  | In progress |\n\n### Production workflow\n\nTBD\n\n### Database restrictions\n\nThis feature requires 3 namespaces:\n\n- `features`\n- `branches`\n- `branches/origin`\n\nIt is strongly recommended to avoid using one of these namespaces in your SurrealDB instance.\n\n### Documentation\n\n```\n# create new branch from current branch with a random name, from default ns/db\nsurrealdb-migrations branch new\n# create new branch from current branch with a name, from default ns/db\nsurrealdb-migrations branch new \u003cBRANCH_NAME\u003e\n# create new branch, from a specific ns/db\nsurrealdb-migrations branch new --ns \u003cNS\u003e --db \u003cDB\u003e\n\n# review diffs between original branch and the new branch\nsurrealdb-migrations branch diff \u003cBRANCH_NAME\u003e\n\n# commit and merge branch changes to the original branch\nsurrealdb-migrations branch merge \u003cBRANCH_NAME\u003e\n\n# remove branch (ie. rollback)\nsurrealdb-migrations branch remove \u003cBRANCH_NAME\u003e\n\n# list all existing branches\nsurrealdb-migrations branch list\n\n# display infos of a branch\nsurrealdb-migrations branch status \u003cBRANCH_NAME\u003e\nsurrealdb-migrations branch \u003cBRANCH_NAME\u003e\n```\n\n## Samples\n\nThis project contains sample apps that demontrates how to use the `surrealdb-migrations` given certain contexts. Here is a list of existing samples:\n\n| Name                 | Description                                                                                                                                                                                                                                                   | Languages/Frameworks  |\n| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------- |\n| [wasm](samples/wasm) | This project shows how to use the `surrealdb-migrations` crate with embedded migrations files in a WASM context.\u003cbr /\u003e The app entry point is powered by SvelteKit and the `vite-plugin-rsw` plugin.\u003cbr /\u003e The SurrealDB data is stored locally in IndexedDb. | SvelteKit/Rust (WASM) |\n\n## Let's see Paul Allen's contributions\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\n\u003c!-- prettier-ignore-start --\u003e\n\u003c!-- markdownlint-disable --\u003e\n\u003ctable\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"http://www.tekacs.com/\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/63247?v=4?s=100\" width=\"100px;\" alt=\"Amar Sood\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAmar Sood\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/Odonno/surrealdb-migrations/commits?author=tekacs\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/Roms1383\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/21016014?v=4?s=100\" width=\"100px;\" alt=\"Rom's\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eRom's\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/Odonno/surrealdb-migrations/commits?author=Roms1383\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"#ideas-Roms1383\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e \u003ca href=\"#infra-Roms1383\" title=\"Infrastructure (Hosting, Build-Tools, etc)\"\u003e🚇\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/pranaypratyush\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/10587083?v=4?s=100\" width=\"100px;\" alt=\"Pranay Pratyush\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ePranay Pratyush\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/Odonno/surrealdb-migrations/issues?q=author%3Apranaypratyush\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/ansarizafar\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/5788284?v=4?s=100\" width=\"100px;\" alt=\"Zafar Ansari\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eZafar Ansari\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#ideas-ansarizafar\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://turulix.de/\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/28957605?v=4?s=100\" width=\"100px;\" alt=\"Tim\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eTim\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#ideas-turulix\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/snarkipus\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/3688989?v=4?s=100\" width=\"100px;\" alt=\"Matt Jackson\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eMatt Jackson\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/Odonno/surrealdb-migrations/issues?q=author%3Asnarkipus\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://keyruu.de/\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/53177682?v=4?s=100\" width=\"100px;\" alt=\"Lucas\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eLucas\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#ideas-Keyruu\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\u003c!-- markdownlint-restore --\u003e\n\u003c!-- prettier-ignore-end --\u003e\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n\n## Credits\n\nInspired by awesome projects:\n\n- [Entity Framework](https://github.com/dotnet/efcore)\n- [Fluent Migrator](https://github.com/fluentmigrator/fluentmigrator)\n- [kards-social](https://github.com/theopensource-company/kards-social) by Micha de Vries [@kearfy](https://github.com/kearfy)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FOdonno%2Fsurrealdb-migrations","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FOdonno%2Fsurrealdb-migrations","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FOdonno%2Fsurrealdb-migrations/lists"}