0

我有一个使用flaskwith的应用程序设计flask-sqlalchemy。为了在模型更改时控制数据库迁移,我使用flask-migrate包装 alembic 并在flask-script管理上下文中使用。

我正在尝试决定如何拆分包分发以实现以下目标

  1. 主应用程序包的最小依赖项集
  2. 允许为迁移和部署分发管理脚本和测试数据,可能使用辅助包,具体取决于主应用程序模块

项目结构如下

/
 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-migrateMigratemanage.pyMigrate.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

我正在尝试分发此应用程序以部署在我们的内部服务器上。有两个分发用例,因为它们目前正在使用

  1. 安装新服务器

    • 安装源分发
    • 创建新的配置文件以反映数据库主机等。
    • 用于manage.py -c /path/to/config创建数据库表database create
    • 将 HTTP 服务器指向 wsgi.py
  2. 更新现有服务器

    • 更新源分布
    • 用于使用manage.py -c /path/to/server/config migration upgrade当前应用上下文提取数据库
    • 服务器继续指向wsgi.py

我想将此分发移动到轮子/包,以便我可以在我们的公司内部网上自动部署,所以我在这里看到的是我想将我的包拆分为myapp只有 Flask 框架依赖项和 wsgi 入口点的主包其中myapp-manage包括manage.pytestsmigrations目录。

因此,在完美世界中,应用程序将安装在具有全局配置文件的系统上,并且特定的管理用户将有权访问管理包以执行升级。

现在,我正致力于将分发与setup-app.pysetup-manage.py同一源分发中创建两个单独的包分开。有没有更合适的方法来使用烧瓶应用程序打包迁移和管理脚本?我已经翻阅了文档,虽然它很清楚如何打包烧瓶应用程序,但管理脚本和迁移的分发策略不太清楚。

4

0 回答 0