# Custom Command Line Commands

The `quart` command can be customised by the app to add additional functionality. A very typical use case is to add a database initialisation command,

    import click

    @app.cli.command()
    def initdb():
        click.echo('Database is migrating')
        ...

which will then work as,

    $ quart initdb
    Database is migrating

Note

Unlike Flask the Quart commands do not run within an app context, as click commands are synchronous rather than asynchronous.

## Asynchronous usage

The best way to use some asynchronous code in a custom command is to create an event loop and run it manually, for example,

    import asyncio

    @app.cli.command()
    def fetch_db_data():
        result = asyncio.get_event_loop().run_until_complete(_fetch())

    async def _fetch():
        return await db.execute(...)

## Including a CLI Command in an extension or another module

To include CLI commands in a Quart extension or blueprint, register the methods in the “run” factory function

    from quart import Quart
    from my_extension import my_cli

    def create_app():
        app = Quart(__name__)
        app = my_cli(app)
        return app

And in your module or extension:

    import click

    def my_cli(app):
        # @click.option("--my-option")
        @app.cli.command("mycli")
        def my_cli_command():
            print("quart ran this command")

        return app

This can be run with:

    $ quart mycli
    $ quart ran this command