好吧,就这样吧。棘手的部分是迁移alembic_version 表,因为它在迁移之前读取并在迁移之后写入。还有几个地方需要配置。
第一次提交
第一次提交是为了准备。无论Base定义在哪里,都改成
base.py
from sqlalchemy import MetaData
from sqlalchemy.orm import declarative_base
Base = declarative_base(metadata=MetaData(schema='public'))
然后修改alembic env(感谢h4!)以匹配这个:
env.py
[...]
context.configure(
connection=connection,
target_metadata=target_metadata,
version_table_schema=target_metadata.schema,
include_schemas=True,
)
with context.begin_transaction():
context.execute(f'create schema if not exists {target_metadata.schema};')
context.execute(f'set search_path to {target_metadata.schema}')
context.run_migrations()
[...]
第二次提交
创建一个新的 Alembic 迁移
2d8cec1e2a62_rename_schema.py
from alembic import op
import sqlalchemy as sa
[...]
def upgrade():
if 'app' not in sa.inspect(op.get_bind()).get_schema_names():
op.execute('alter schema public rename to app')
op.execute('create schema public')
op.execute('create table public.alembic_version AS (select * from app.alembic_version)')
def downgrade():
pass
提交并运行迁移!
第三次提交
将base.py 中的架构更改为'app':
base.py
from sqlalchemy import MetaData
from sqlalchemy.orm import declarative_base
Base = declarative_base(metadata=MetaData(schema='app'))
提交并运行迁移。