Ron*_*Ron 42 python sqlalchemy alembic
我正在向现有表添加列.这个新专栏是nullable=False.
op.add_column('mytable', sa.Column('mycolumn', sa.String(), nullable=False))
Run Code Online (Sandbox Code Playgroud)
当我运行迁移时,它会抱怨:
sqlalchemy.exc.IntegrityError: column "mycolumn" contains null values
Run Code Online (Sandbox Code Playgroud)
Ron*_*Ron 72
这是因为您的现有数据对该新列没有任何价值,即null.从而导致所述错误.添加不可为空的列时,必须确定为现有数据提供的值
好吧,现在的数据应该只有这个新专栏的"lorem ipsum".但是我该怎么办呢?我无法更新,因为该列还没有.
使用server_defaultarg:
op.add_column('mytable', sa.Column(
'mycolumn',
sa.String(),
nullable=False,
server_default='lorem ipsum', # <--- add this
))
Run Code Online (Sandbox Code Playgroud)
但是,我不希望它具有默认值
之后再使用它 op.alter_column('mytable', 'mycolumn', server_default=None)
例如你的upgrade()功能是:
def upgrade():
op.add_column('mytable', sa.Column('mycolumn', sa.String(), nullable=False, server_default='lorem ipsum'))
op.alter_column('mytable', 'mycolumn', server_default=None)
Run Code Online (Sandbox Code Playgroud)
Ant*_*zée 28
@ Ron的答案的另一种选择是反过来,并在添加约束之前修改数据:
def upgrade():
op.add_column('my_table', sa.Column('my_column', sa.String()))
op.execute('UPDATE my_table SET my_column=my_other_column')
op.alter_column('my_table', 'my_column', nullable=False)
Run Code Online (Sandbox Code Playgroud)
对我来说似乎更清洁,更强大,但你正在编写SQL :-).
它正确地告诉您,数据库中该列存在(或将存在)现有NULL值。答案是在更改列定义之前编辑迁移文件以更新列:
from sqlalchemy.sql import table, column
def upgrade():
op.add_column('role', sa.Column('role_name', sa.String(length=30), nullable=True))
role = table('role', column('role_name'))
op.execute(role.update().values(role_name=''))
op.alter_column('role', 'role_name', nullable=False)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13613 次 |
| 最近记录: |