# Flask Migrate

***

**1. Database Migration Management**

```python
from flask_migrate import Migrate, MigrateCommand
from flask_script import Manager

app = Flask(__name__)
migrate = Migrate(app, db, compare_type=True)
manager = Manager(app)
manager.add_command('db', MigrateCommand)
```

**2. Schema Revision**

```python
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()
migrate = Migrate(db=db, app=app)
```

**3. Custom Query Migration**

```python
from flask_migrate import Migrate
from sqlalchemy import text

migrate = Migrate(compare_type=True)
migrate.init_app(app, db)

@migrate.version(revision='v1.1')
def custom_query():
    db.engine.execute(text("CREATE TABLE my_table (col_int INT, col_string TEXT)"))
```

**4. Auto-Generate Revision**

```python
from flask_migrate import Migrate, MigrateCommand
from flask_script import Manager

app = Flask(__name__)
db = SQLAlchemy(app)
migrate = Migrate(app, db, directory='migrations')
manager = Manager(app)
manager.add_command('db', MigrateCommand)
```

**5. Declarative Migration**

```python
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()
migrate = Migrate(app, db)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
```

**6. Database Upgrade**

```python
from flask_migrate import upgrade

upgrade(directory='./migrations')
```

**7. Database Downgrade**

```python
from flask_migrate import downgrade

downgrade(directory='./migrations')
```

**8. Database Revisions**

```python
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()
migrate = Migrate(app, db, render_as_batch=True)
```

**9. Manual Migrations**

```python
from flask_migrate import Migrate

migrate = Migrate(compare_type=True)
migrate.init_app(app, db)

@migrate.migration()
def manual_migration():
    op.add_column('users', sa.Column('salary', sa.Integer))
```

**10. Create Migration**

```python
from flask_migrate import Migrate

migrate = Migrate()
migrate.create_version()
```

**11. Database Stamp**

```python
from flask_migrate import migrate

migrate(directory='./migrations')
```

**12. Add Column**

```python
from flask_migrate import Migrate
from sqlalchemy import Column, Integer, String

migrate = Migrate(compare_type=True)
migrate.init_app(app, db)

@migrate.migration()
def add_column_user():
    op.add_column('user', Column('age', Integer))
```

**13. Drop Column**

```python
from flask_migrate import Migrate
from sqlalchemy import Column, String

migrate = Migrate(compare_type=True)
migrate.init_app(app, db)

@migrate.migration()
def drop_column_user():
    op.drop_column('user', 'age')
```

**14. Alter Column**

```python
from flask_migrate import Migrate
from sqlalchemy import Column, Integer, String

migrate = Migrate(compare_type=True)
migrate.init_app(app, db)

@migrate.migration()
def alter_column_user():
    op.alter_column('user', 'age', existing_type=Integer(), nullable=False)
```

**15. Rename Table**

```python
from flask_migrate import Migrate

migrate = Migrate(compare_type=True)
migrate.init_app(app, db)

@migrate.migration()
def rename_table_user():
    op.rename_table('user', 'users')
```

**16. Create Index**

```python
from flask_migrate import Migrate
from sqlalchemy import Index

migrate = Migrate(compare_type=True)
migrate.init_app(app, db)

@migrate.migration()
def create_index_user():
    op.create_index('idx_user_name', 'user', ['name'])
```

**17. Drop Index**

```python
from flask_migrate import Migrate
from sqlalchemy import text

migrate = Migrate(compare_type=True)
migrate.init_app(app, db)

@migrate.migration()
def drop_index_user():
    op.execute(text("DROP INDEX idx_user_name"))
```

**18. Create Foreign Key**

```python
from flask_migrate import Migrate
from sqlalchemy import ForeignKey, Column, Integer

migrate = Migrate(compare_type=True)
migrate.init_app(app, db)

@migrate.migration()
def create_foreign_key_user():
    op.add_column('user', Column('group_id', Integer))
    op.create_foreign_key('fk_user_group', 'user', 'group', ['group_id'], ['id'])
```

**19. Drop Foreign Key**

```python
from flask_migrate import Migrate
from sqlalchemy import text

migrate = Migrate(compare_type=True)
migrate.init_app(app, db)

@migrate.migration()
def drop_foreign_key_user():
    op.execute(text("ALTER TABLE user DROP CONSTRAINT fk_user_group"))
```

**20. Create Unique Constraint**

```python
from flask_migrate import Migrate
from sqlalchemy import UniqueConstraint

migrate = Migrate(compare_type=True)
migrate.init_app(app, db)

@migrate.migration()
def create_unique_constraint_user():
    op.create_unique_constraint('uq_user_name', 'user', ['name'])
```

**21. Drop Unique Constraint**

```python
from flask_migrate import Migrate
from sqlalchemy import text

migrate = Migrate(compare_type=True)
migrate.init_app(app, db)

@migrate.migration()
def drop_unique_constraint_user():
    op.execute(text("ALTER TABLE user DROP CONSTRAINT uq_user_name"))
```

**22. Create Check Constraint**

```python
from flask_migrate import Migrate
from sqlalchemy import CheckConstraint

migrate = Migrate(compare_type=True)
migrate.init_app(app, db)

@migrate.migration()
def create_check_constraint_user():
    op.create_check_constraint('ck_user_age', 'user', 'age > 18')
```

**23. Drop Check Constraint**

```python
from flask_migrate import Migrate
from sqlalchemy import text

migrate = Migrate(compare_type=True)
migrate.init_app(app, db)

@migrate.migration()
def drop_check_constraint_user():
    op.execute(text("ALTER TABLE user DROP CONSTRAINT ck_user_age"))
```

**24. Merge Revisions**

```python
from flask_migrate import Migrate
from sqlalchemy import text

migrate = Migrate(compare_type=True)
migrate.init_app(app, db)

@migrate.migration()
def merge_revisions():
    op.execute(text("ALTER TABLE user ADD COLUMN merged_col TEXT"))
```

**25. Split Revisions**

```python
from flask_migrate import Migrate
from sqlalchemy import text

migrate = Migrate(compare_type=True)
migrate.init_app(app, db)

@migrate.migration()
def split_revisions():
    op.execute(text("ALTER TABLE user DROP COLUMN merged_col"))
```

**26. Custom Down Revision**

```python
from flask_migrate import Migrate
from sqlalchemy import text

migrate = Migrate(compare_type=True)
migrate.init_app(app, db)

@migrate.migration()
def custom_down_revision():
    # Customize the down revision logic here
    pass
```

**27. Batch Operations**

```python
from flask_migrate import Migrate

migrate = Migrate(render_as_batch=True)
migrate.init_app(app, db)
```

**28. Command-Line Script**

```python
from flask_migrate import Migrate, MigrateCommand
from flask_script import Manager

app = Flask(__name__)
db = SQLAlchemy()
migrate = Migrate(app, db)
manager = Manager(app)
manager.add_command('db', MigrateCommand)

if __name__ == '__main__':
    manager.run()
```

**29. Upgrade to Latest Revision**

```python
from flask_migrate import upgrade

upgrade()
```

**30. Downgrade to Specific Revision**

```python
from flask_migrate import downgrade

downgrade(revision='v1.0')
```

**31. Create Snapshot**

```python
from flask_migrate import create_snapshot

create_snapshot()
```

**32. Compare Revisions**

```python
from flask_migrate import compare

compare(revision1, revision2)
```

**33. Set/Get Migration Context**

```python
from flask_migrate import get_migration_context

migration_context = get_migration_context()
```

**34. Custom Command**

```python
from flask_migrate import MigrateCommand, command_processor
from flask_script import Command

class CustomCommand(Command):

    def run(self):
        # Custom implementation


command_processor.add_command('custom', CustomCommand)
```

**35. Event Hooks**

```python
from flask_migrate import Migrate

migrate = Migrate()

@migrate.on_before_migrate(app)
def before_migrate(app):
    # Custom logic before migration

@migrate.on_after_migrate(app, connection)
def after_migrate(app, connection):
    # Custom logic after migration
```

**36. Environment Configuration**

```python
from flask_migrate import Migrate

migrate = Migrate(db, compare_type=True)
migrate.init_app(app, migrate_env={'engine_name': 'my_engine'})
```
