---
id: multischema-migrations
title: Multi-Schema Migration
---
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
import InstallationInstructions from './components/_installation_instructions.mdx';
Using the [Atlas](https://atlasgo.io) migration engine, an Ent schema can be defined and managed across multiple
database schemas. This guides show how to achieve this with three simple steps:
:::info [Atlas Pro Feature](https://atlasgo.io/features#pro-plan)
The _multi-schema migration_ feature is fully implemented in the Atlas CLI and requires a login to use:
```
atlas login
```
:::
## Install Atlas
## Login to Atlas
```shell
$ atlas login a8m
//highlight-next-line-info
You are now connected to "a8m" on Atlas Cloud.
```
## Annotate your Ent schemas
The `entsql` package allows annotating an Ent schema with a database schema name. For example:
```go
// Annotations of the User.
func (User) Annotations() []schema.Annotation {
return []schema.Annotation{
entsql.Schema("db3"),
}
}
```
To share the same schema configuration across multiple Ent schemas, you can either use `ent.Mixin` or define and embed a _base_ schema:
```go title="mixin.go"
// Mixin holds the default configuration for most schemas in this package.
type Mixin struct {
mixin.Schema
}
// Annotations of the Mixin.
func (Mixin) Annotations() []schema.Annotation {
return []schema.Annotation{
entsql.Schema("db1"),
}
}
```
```go title="user.go"
// User holds the edge schema definition of the User entity.
type User struct {
ent.Schema
}
// Mixin defines the schemas that mixed into this schema.
func (User) Mixin() []ent.Mixin {
return []ent.Mixin{
//highlight-next-line
Mixin{},
}
}
```
```go title="base.go"
// base holds the default configuration for most schemas in this package.
type base struct {
ent.Schema
}
// Annotations of the base schema.
func (base) Annotations() []schema.Annotation {
return []schema.Annotation{
entsql.Schema("db1"),
}
}
```
```go title="user.go"
// User holds the edge schema definition of the User entity.
type User struct {
//highlight-next-line
base
}
```
## Generate migrations
To generate a migration, use the `atlas migrate diff` command. For example:
```shell
atlas migrate diff \
--to "ent://ent/schema" \
--dev-url "docker://mysql/8"
```
```shell
atlas migrate diff \
--to "ent://ent/schema" \
--dev-url "docker://maria/8"
```
```shell
atlas migrate diff \
--to "ent://ent/schema" \
--dev-url "docker://postgres/15/dev"
```
:::note
The `migrate` diff command generates a list of SQL statements without indentation by default. If you would like to
generate the SQL statements with indentation, use the `--format` flag. For example:
```shell
atlas migrate diff \
--to "ent://ent/schema" \
--dev-url "docker://postgres/15/dev" \
// highlight-next-line
--format "{{ sql . \" \" }}"
```
:::