升级后,如何使用基于另一个 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
我可以想到两种方法:
- 手动执行一些操作来填充新的 table。
- 不要填写新的 table 并编写类似于
settings_get_or_create()
的函数(如果该用户的设置行不存在,它将为该用户创建新设置)。
还有其他办法吗?什么最好?
我正在使用 Alembic
、SQLAlchemy
和 SQL
数据库。
使用 this 答案解决。原来,我要求的是所谓的“数据迁移”。
我有这个 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
我可以想到两种方法:
- 手动执行一些操作来填充新的 table。
- 不要填写新的 table 并编写类似于
settings_get_or_create()
的函数(如果该用户的设置行不存在,它将为该用户创建新设置)。
还有其他办法吗?什么最好?
我正在使用 Alembic
、SQLAlchemy
和 SQL
数据库。
使用 this 答案解决。原来,我要求的是所谓的“数据迁移”。