升级后,如何使用基于另一个 table 现有值的值填充新 table?

After upgrade, how to fill new table with values that based on existing values of another table?

我有这个 table,里面有一些数据:

Name: 
users

Columns:
id (primary key) | name

Rows:
1) 1 | "name 1"
2) 2 | "name 2"
3) 3 | "name 3"

Relationships:
settings

我需要创建这个 table:

Name:
user_settings

Columns:
user_id (primary_key, foreign_key) | some_key

Relationships:
user

使用 alembic revision 我得到了这个升级脚本:

def upgrade():
    op.create_table('user_settings',
        sa.Column('user_id', sa.Integer(), nullable=False),
        sa.Column('some_key', sa.String(), nullable=True),
        sa.ForeignKeyConstraint(['user_id'], ['users.id']),
        sa.PrimaryKeyConstraint('user_id')
    )

alembic upgrade 之后它创建了一个空的 user_settings table(正如预期的那样)。但是我需要在升级后立即为每个现有用户使用设置值。例如,当我通过以下 SQLAlchemy 查询获取用户值时:

user = User.query.filter(User.id == id).first()

我应该能够像这样访问用户设置:

value = user.settings.some_key

但是升级后不能马上升级,因为user_settings table是空的。

如何在升级后立即用映射值填充新的 table? 这样当我 运行 alembic upgrade 我应该得到一个 table 有值,不是空的 table:

Name:
user_settings

Columns:
user_id (primary_key, foreign_key) | some_key

Rows:
1) 1 | "default value"
2) 2 | "default value"
3) 3 | "default value"

Relationships:
user

我可以想到两种方法:

  1. 手动执行一些操作来填充新的 table。
  2. 不要填写新的 table 并编写类似于 settings_get_or_create() 的函数(如果该用户的设置行不存在,它将为该用户创建新设置)。

还有其他办法吗?什么最好?

我正在使用 AlembicSQLAlchemySQL 数据库。

使用 this 答案解决。原来,我要求的是所谓的“数据迁移”。