flask 和Alembic:如何将模型迁移到postgresql

xcitsw88  于 2023-03-01  发布在  PostgreSQL
关注(0)|答案(1)|浏览(148)

我在做一个面试的技术测试。
这是一个在docker中运行的带有PostgreSQL的 flask 应用程序,并且已经使用了SqlAlchemy。不幸的是,我没有关于 flask 的知识,只有Django。
我已经添加了一个新的Model到我的应用程序,我需要做一个迁移来更新数据库,基本上是makemigrationsmigrate在Django中所做的。
在我的docker应用程序中,我添加了alembic与pip install alembic,然后我执行alembic init migrations,其中添加了一个新的文件夹迁移与默认配置env.py内。
然后我尝试运行alembic revision --autogenerate -m "add MySuperModel",但我得到了这个错误:sqlalchemy.exc.NoSuchModuleError: Can't load plugin: sqlalchemy.dialects:driver
我不知道我的思路是否正确。
我想做的是在我的 flask 应用程序中运行python manage.py makemigrationspython manage.py migrate,该应用程序已经使用了SqlAlchemy。

42fyovps

42fyovps1#

序言

能够做到这一点实际上是非常重要的。使用flask-sqlalchemy开发的模型不能在flask本身之外使用。有flask-migrate,但 * 需要使用 * flask-sqlalchemy。有this等指南解释了数据库的设置。甚至flask本身与SQLAlchemy in Flask,以避免这种限制。当谈到alembic为这个设置,我找不到任何东西。所以,这是最好的我有atm,并欢迎其他答案。

使用command

这是我迄今为止使用commands模块为一个名为ex_machina的项目引入任意SQLAlchemy模型时所得到的最好的结果。

database.py位于项目的顶层。

import os

from alembic import command
from alembic.config import Config as AlembicConfig
from sqlalchemy import create_engine, MetaData
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base

from ex_machina.config import Config

engine = create_engine(Config.CONN_STRING)
db_session = scoped_session(sessionmaker(autocommit=False,
                                         autoflush=False,
                                         bind=engine))

meta = MetaData(naming_convention={
        "ix": "ix_%(column_0_label)s",
        "uq": "uq_%(table_name)s_%(column_0_name)s",
        "ck": "ck_%(table_name)s_%(column_0_name)s",
        "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",
        "pk": "pk_%(table_name)s"
      })

Base = declarative_base(metadata=meta)
Base.query = db_session.query_property()

def _get_alembic_config():
    directory = os.path.dirname(__file__)
    alembic_directory = os.path.join(directory, 'alembic')
    alembic_cfg = AlembicConfig()
    alembic_cfg.set_main_option('sqlalchemy.url', 
                                Config.CONN_STRING)
    alembic_cfg.set_main_option('script_location', alembic_directory)
    return alembic_cfg

def _migrate():
    
    import ex_machina.admin.models
    import ex_machina.auth.models
    import ex_machina.departments.models
    import ex_machina.home.models
    
    alembic_cfg = _get_alembic_config()
    
    command.stamp(alembic_cfg, 'head')
    command.revision(alembic_cfg, autogenerate=True)

def _upgrade():
    alembic_cfg = _get_alembic_config()
    command.upgrade(alembic_cfg, 'head')
    
    
def _downgrade(hash_):
    alembic_cfg = _get_alembic_config()
    command.downgrade(alembic_cfg, hash_)

def init_db():
    import ex_machina.admin.models
    import ex_machina.auth.models
    import ex_machina.departments.models
    import ex_machina.home.models
    Base.metadata.create_all(bind=engine)

消毒剂环境py

# add your model's MetaData object here
# for 'autogenerate' support
# from myapp import mymodel
# target_metadata = mymodel.Base.metadata
# target_metadata = None
from ex_machina import database
target_metadata = database.Base.metadata

我不喜欢它,但是你可以用一个CLI来 Package 这个概念证明。我期待着一个更好的指南。

相关问题