- Notifications
You must be signed in to change notification settings - Fork20
An awesome SurrealDB migration tool, with a user-friendly CLI and a versatile Rust library that enables seamless integration into any project.
License
Odonno/surrealdb-migrations
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
An awesome SurrealDB migration tool, with a user-friendly CLI and a versatile Rust library that enables seamless integration into any project.
WarningThis project is not production-ready, use at your own risk.
This project can be used:
- as a Rust library
cargo add surrealdb-migrations
- or as a CLI
cargo install surrealdb-migrations
- or inside a CI workflow, using aGitHub Action
Checksurrealdb-migrations GitHub Action in the marketplace
- or even as an
initContainervia aDocker image
docker pull dbottiau/surrealdb-migrations:latest
The 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.
A schema file represents no more than one SurrealDB table. The list of schemas can be seen as the Query model (in a CQRS pattern). Theschemas folder can be seen as a view of the current data model.
An 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). Theevents folder can be seen as a view of the different ways to update the data model.
A 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...
stateDiagram-v2 scaffold : Scaffold a project changeSchema : Change schema/event createMigration: Create migration (data changes) apply : Apply to your database state fork_state <<fork>> [*] --> scaffold scaffold --> fork_state fork_state --> changeSchema fork_state --> createMigration state join_state <<join>> changeSchema --> join_state createMigration --> join_state join_state --> apply apply --> fork_stateYou can start a migration project by scaffolding a new project using the following command line:
surrealdb-migrations scaffold template emptyThis will create the necessary folders and files in order to perform migrations. Theempty template should look like this:
- /schemas
- script_migration.surql
- /events
- /migrations
There are a number of pre-defined templates so you can play around and get started quickly.
Once 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.
You can create strict schema files that represent tables stored in SurrealDB.
surrealdb-migrations create schema post --fields title,content,author,created_at,statusThis will create a schemaless table with predefined fields:
DEFINE TABLE post SCHEMALESS;DEFINE FIELD title ON post;DEFINE FIELD content ON post;DEFINE FIELD author ON post;DEFINE FIELD created_at ON post;DEFINE FIELD status ON post;You can also create events in the same way.
surrealdb-migrations create event publish_post --fields post_id,created_atThis will define a table event with predefined fields:
DEFINE TABLE publish_post SCHEMALESS;DEFINE FIELD post_id ON publish_post;DEFINE FIELD created_at ON publish_post;DEFINE EVENT publish_post ON TABLE publish_post WHEN $event == "CREATE" THEN ( # TODO);And when updating data, you can create migration files this way:
surrealdb-migrations create AddAdminUserThis will create a new file using the current date & time of the day, like20230317_153201_AddAdminUser.surql for example. All migrations files should be listed in a temporal order.
Finally, when you are ready, you can apply your schema and migrations to the database using the following command line:
surrealdb-migrations applyOr directly inside your Rust project using the following code:
use surrealdb_migrations::MigrationRunner;use surrealdb::engine::any::connect;use surrealdb::opt::auth::Root;#[tokio::main]asyncfnmain() ->Result<()>{let db =connect("ws://localhost:8000").await?;// Signin as a namespace, database, or root user db.signin(Root{username:"root",password:"root",}).await?;// Select a specific namespace / database db.use_ns("namespace").use_db("database").await?;// Apply all migrationsMigrationRunner::new(&db).up().await.expect("Failed to apply migrations");Ok(())}
Repeat the process from step 2. Change schema and/or create data change migrations.
To help you get started quickly, there is a list of predefined templates you can use:
| Template | Description |
|---|---|
| empty | The smallest migration project you can create. A clean schema with an already defined script_migration table to store the applied migrations. |
| blog | A blog domain model, with users having the ability to publish/unpublish posts and comments. |
| ecommerce | An ecommerce domain model, with customers having the ability to purchase products. |
You can scaffold a project using any of these templates using the following command line:
surrealdb-migrations scaffold template <TEMPLATE>You 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.
[core]path ="./tests-files"schema ="less"[db]address ="ws://localhost:8000"username ="root"password ="root"ns ="test"db ="test"
In thecore section, you can define the path to your schema/migration files, if it is not the current folder.
In thedb section, you can define the values used to access your SurrealDB database. It can be theurl,username,password, the namespacens or the name of the databasedb.
Here is the definition of the.surrealdb configuration file:
[core]# Optional# Type: String# Description: Path to the folder that contains your migration project (root folder by default)# Default: "."path# Optional# Type: "less" | "full"# Description: Define SCHEMALESS or SCHEMAFULL option by default when creating new table/event file# Default: "less"schema[db]# Optional# Type: String# Description: Address of the surrealdb instance# Default: "ws://localhost:8000"address# Optional# Type: String# Description: Username used to authenticate to the surrealdb instance# Default: "root"username# Optional# Type: String# Description: Password used to authenticate to the surrealdb instance# Default: "root"password# Optional# Type: String# Description: Namespace to use inside the surrealdb instance# Default: "test"ns# Optional# Type: String# Description: Name of the database to use inside the surrealdb instance# Default: "test"db[filters]# Optional# Type: Array<String># Description: Tags used to filter schema/migration files# Default: [ "*" ]tags# Optional# Type: Array<String># Description: Tags used to exclude schema/migration files# Default: [ "old" ]exclude_tags
Here is the list of all environment variables that you can use:
SURREAL_MIG_PATH- Path to the folder that contains your migration projectSURREAL_MIG_SCHEMA- Define SCHEMALESS or SCHEMAFULL option by default when creating new table/event fileSURREAL_MIG_ADDRESS- Address of the surrealdb instanceSURREAL_MIG_USER- Username used to authenticate to the surrealdb instanceSURREAL_MIG_PASS- Password used to authenticate to the surrealdb instanceSURREAL_MIG_NS- Namespace to use inside the surrealdb instanceSURREAL_MIG_DB- Name of the database to use inside the surrealdb instanceSURREAL_MIG_TAGS- Tags used to filter schema/migration filesSURREAL_MIG_EXCLUDE_TAGS- Tags used to exclude schema/migration files
The execution context describes how configuration settings are applied and prioritized when a command is executed.
The order of execution goes like this:
Environment variables -> Configuration file -> CLI argumentsEnvironment variables: Default settings can be via environment variables. These are typically set up in the system or shell environment.
Configuration file: If additional customization is needed, a config file can override environment variables, offering fine-tuned settings. See the section above.
CLI arguments: These take precedence over both environment variables and the configuration file. CLI arguments are explicitly provided at runtime, ensuring immediate and specific customization for the specified command.
By 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:
- Inside the
/migrations/downfolder with the same name as your forward migration - Inside the
/migrationsbut with the.down.surqlextension next to the forward migration
So, a migration project with backward migrations might look like this:
- /schemas
- script_migration.surql
- /events
- /migrations
- 20231605_205201_AddProduct.surql
- /down
- 20231605_205201_AddProduct.surql
Or like this:
- /schemas
- script_migration.surql
- /events
- /migrations
- 20231605_205201_AddProduct.surql
- 20231605_205201_AddProduct.down.surql
If you want to create a DOWN migration file when creating the migration file, use this command:
surrealdb-migrations create AddProduct --downIf you need to, you can revert all migrations back to the one you specified.
surrealdb-migrations apply --down 20231605_205201_AddProductAnd if you need to undo all your migrations, use this command:
surrealdb-migrations apply --down 0Database branching is a similar concept to version control system like Git where you manage code repositories with branches.
With 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.
You 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.
In 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.
stateDiagram-v2 main : Main branch createBranch : Create branch "feature-1" makeChanges : Make changes on "feature-1" merge : Merge "feature-1" on main remove : Remove branch "feature-1" [*] --> main main --> [*] main --> createBranch createBranch --> makeChanges makeChanges --> remove makeChanges --> merge remove --> [*] merge --> [*]You start by creating a new branch using the following command line:
surrealdb-migrations branch new --address http://localhost:8000You will then receive a message like this:
You can now use the branch with the following configuration:ns: branchesdb: bright-fold-1617You can now make your changes on the newly generated database usingns anddb properties.When you are done with your changes, you can merge your branch to the origin branch using the following command line:
surrealdb-migrations branch merge bright-fold-1617 --mode all --address http://localhost:8000There are 3 merge modes, each with its own interest:
| Mode | Description | Status |
|---|---|---|
| schema-only | A diff of schema will be applied between the branch and the origin branch at the moment of the branch creation. If possible, the merge will operate schema changes on the origin branch: * defining new tables, fields, etc... * removing tables, fields, etc... | Planned |
| all | As an extension to theschema-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.If possible, the merge will operate schema and data changes on the origin branch: * defining new tables, fields, etc... * removing tables, fields, etc... * adding, updating or removing table rows/columns | Planned |
| overwrite | Merging the branch will completely destroy the origin branch and replace it with the new one. The main branch will have the schema and the data set in the merged branch. | In progress |
TBD
This feature requires 3 namespaces:
featuresbranchesbranches/origin
It is strongly recommended to avoid using one of these namespaces in your SurrealDB instance.
# create new branch from current branch with a random name, from default ns/dbsurrealdb-migrations branch new# create new branch from current branch with a name, from default ns/dbsurrealdb-migrations branch new <BRANCH_NAME># create new branch, from a specific ns/dbsurrealdb-migrations branch new --ns <NS> --db <DB># review diffs between original branch and the new branchsurrealdb-migrations branch diff <BRANCH_NAME># commit and merge branch changes to the original branchsurrealdb-migrations branch merge <BRANCH_NAME># remove branch (ie. rollback)surrealdb-migrations branch remove <BRANCH_NAME># list all existing branchessurrealdb-migrations branch list# display infos of a branchsurrealdb-migrations branch status <BRANCH_NAME>surrealdb-migrations branch <BRANCH_NAME>This project contains sample apps that demontrates how to use thesurrealdb-migrations given certain contexts. Here is a list of existing samples:
| Name | Description | Languages/Frameworks |
|---|---|---|
| wasm | This project shows how to use thesurrealdb-migrations crate with embedded migrations files in a WASM context.The app entry point is powered by SvelteKit and the vite-plugin-rsw plugin.The SurrealDB data is stored locally in IndexedDb. | SvelteKit/Rust (WASM) |
Thanks goes to these wonderful people (emoji key):
This project follows theall-contributors specification. Contributions of any kind welcome!
Inspired by awesome projects:
- Entity Framework
- Fluent Migrator
- kards-social by Micha de Vries@kearfy
About
An awesome SurrealDB migration tool, with a user-friendly CLI and a versatile Rust library that enables seamless integration into any project.
Topics
Resources
License
Contributing
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Uh oh!
There was an error while loading.Please reload this page.
Contributors9
Uh oh!
There was an error while loading.Please reload this page.