如何设置迁移到flask的模式

问题描述 投票:0回答:1

要将模型迁移到数据库,我使用

Flask-Migrate

我希望在不同的数据库模式中执行迁移,但问题是

Flask-Migrate
在迁移之前不查看其他模式

这是我的代码

# app/__init__.py

app = Flask(__name__)
app.config.from_object(os.environ.get('FLASK_ENV'))
db = SQLAlchemy(app)
migrate = Migrate(app, db)

from app import models
# app/models.py

class Bot(db.Model):
    __tablename__ = "bot"
    __table_args__ = {"schema": "schema_tg_bot"}
    id = db.Column(db.Integer, primary_key=True)
    token = db.Column(db.String(), unique=True, nullable=False)
    name = db.Column(db.String(), nullable=False)

执行命令后

flask db migrate -m "init"

flask db upgrade

在文件夹迁移中创建版本

def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.create_table('tg_bot',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('token', sa.String(), nullable=False),
    sa.Column('name ', sa.String(), nullable=False),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('token'),
    schema='auto_ecommerce_tg_bot'
    )
    # ### end Alembic commands ###

添加新列后

class Bot(db.Model):
    ...
    type = db.Column(db.String(), nullable=False)

它再次创建相同的文件

def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.create_table('tg_bot',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('token', sa.String(), nullable=False),
    sa.Column('name', sa.String(), nullable=False),
    sa.Column('type', sa.String(), nullable=False),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('token'),
    schema='auto_ecommerce_tg_bot'
    )
    # ### end Alembic commands ###

但是调用

flask db upgrade
时出现错误

sqlalchemy.exc.ProgrammingError: (psycopg2.errors.DuplicateTable) relation "tg_bot" already exists
        shop_id INTEGER NOT NULL,
        type VARCHAR NOT NULL,
        PRIMARY KEY (id),
        UNIQUE (shop_id),
        UNIQUE (token)
)

如果您不指定方案,那么一切都会正常工作

在文件夹迁移中创建版本

def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    with op.batch_alter_table('tg_bot', schema=None) as batch_op:
        batch_op.add_column(sa.Column('type', sa.String(), nullable=False))

    # ### end Alembic commands ###
flask flask-sqlalchemy flask-migrate
1个回答
0
投票

我搜索了图书馆并找到了论点

include_schemas

# app/__init__.py

app = Flask(__name__)
app.config.from_object(os.environ.get('FLASK_ENV'))
db = SQLAlchemy(app)
migrate = Migrate(app, db, include_schemas=True)

from app import models

它对我有帮助,现在文件夹迁移中的版本如下:

def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('tg_bot', schema='auto_ecommerce_tg_bot') as batch_op:
batch_op.add_column(sa.Column('type', sa.String(), nullable=False))

# ### end Alembic commands ###
© www.soinside.com 2019 - 2024. All rights reserved.