我有一个使用flask
with的应用程序设计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
对象附加到. 这也允许我在与一般烧瓶/应用程序配置相同的配置文件中控制迁移配置(因为配置上下文由管理器和 with 推送)flask-migrate
Migrate
manage.py
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 创建表并使用目录中的 test_data 填充表tests/
,但不挂钩任何迁移脚本,并允许我使用应用程序配置上下文python manage.py migration init/revision/migrate/...
执行flask-migrate
/命令。alembic
我正在尝试分发此应用程序以部署在我们的内部服务器上。有两个分发用例,因为它们目前正在使用
安装新服务器
- 安装源分发
- 创建新的配置文件以反映数据库主机等。
- 用于
manage.py -c /path/to/config
创建数据库表database create
- 将 HTTP 服务器指向 wsgi.py
更新现有服务器
- 更新源分布
- 用于使用
manage.py -c /path/to/server/config migration upgrade
当前应用上下文提取数据库 - 服务器继续指向wsgi.py
我想将此分发移动到轮子/包,以便我可以在我们的公司内部网上自动部署,所以我在这里看到的是我想将我的包拆分为myapp
只有 Flask 框架依赖项和 wsgi 入口点的主包其中myapp-manage
包括manage.py
、tests
和migrations
目录。
因此,在完美世界中,应用程序将安装在具有全局配置文件的系统上,并且特定的管理用户将有权访问管理包以执行升级。
现在,我正致力于将分发与setup-app.py
从setup-manage.py
同一源分发中创建两个单独的包分开。有没有更合适的方法来使用烧瓶应用程序打包迁移和管理脚本?我已经翻阅了文档,虽然它很清楚如何打包烧瓶应用程序,但管理脚本和迁移的分发策略不太清楚。