我使用flask
和flask-sqlalchemy
进行了应用程序设计。为了在模型更改时控制数据库迁移,我使用flask-migrate
来包装alembic并在flask-script
管理上下文中使用。
我正在尝试决定如何拆分包分发以实现以下目标
项目结构如下
/
tests/ #test data
migrations/ #alembic root include env.py and alembic.ini
myapp/ # application package
setup.py
manage.py
wsgi.py
我的manage.py
看起来很像以下。这是我通过将alembic
对象附加到flask-migrate
中的应用程序来避免主应用程序包中的任何Migrate
或manage.py
依赖项的方法。这也允许我在与通用flask / app配置相同的配置文件中控制迁移配置(因为配置上下文由管理员推送并且Migrate.init_app
)
from myapp import db, create_app
from myapp.database import database_manager #sub manager for creating/dropping db
from flask_migrate import Migrate, MigrateCommand
def _create_app(*args, **kwargs):
app = create_app(*args, **kwargs)
if migration is not None:
migration.init_app(app)
return app
manager = Manager(_create_app)
migration = Migrate(db = db)
manager.add_command('database', database_manager)
manager.add_command('migration', MigrateCommand)
if __name__ == "__main__":
manager.run()
应用程序子管理器myapp.database.database_manager
启用python manage.py database create/drop/test_data
等命令,它使用sqlalchemy创建表并使用tests/
目录中的test_data填充表,但不会挂钩任何迁移脚本,并且允许我使用python manage.py migration init/revision/migrate/...
使用应用程序配置上下文执行flask-migrate
/ alembic
命令。
我正在尝试分发此应用程序以在我们的内部服务器上进行部署。目前正在使用两种分发用例
安装新服务器
manage.py -c /path/to/config
创建包含database create
更新现有服务器
manage.py -c /path/to/server/config migration upgrade
使用当前应用上下文来提取数据库我想将此发行版转移到wheel / packages,以便我可以在我们的公司内部网上自动部署,所以我在这里看到的是我想将我的包拆分为主包myapp
仅包含Flask框架依赖项和wsgi入口点,myapp-manage
包含manage.py
,tests
和migrations
目录。
因此,在完美的世界中,应用程序将安装在具有全局配置文件的系统上,并且特定管理用户可以访问管理包以执行升级。
现在我正倾向于使用setup-app.py
和setup-manage.py
分配分发,以便从同一源代码分发中创建两个单独的包。有没有更合适的方法来使用烧瓶应用程序打包迁移和管理脚本?我已经挖掘了文档,虽然它清楚如何打包烧瓶应用程序,管理脚本和迁移的分发策略不太清楚。