gpt4 book ai didi

python - Alembic 的 server_default 和 Postgres

转载 作者:行者123 更新时间:2023-11-29 12:23:54 25 4
gpt4 key购买 nike

我想使用 alembic 运行从 sqlalchemy 模型到另一个模型的迁移。初始模型如下所示:

from sqlalchemy.dialects.postgresql import JSONB
from sqlalchemy_utils import UUIDType

class Foo(db.Model):
__tablename__ = 'foo'
id = db.Column(UUIDType(binary=True), primary_key=True)
foo_field = db.Column(JSONB)

并且我想让 foo_field 不可为空:

class Foo(db.Model):
__tablename__ = 'foo'
id = db.Column(UUIDType(binary=True), primary_key=True)
foo_field = db.Column(JSONB, nullable=False)

我想运行一个 alembic 脚本来改变列,但由于我现有的一些 foo_field 是空的,我想使用 server_default 来应用默认值(一个空的字典)在改变时

op.alter_column('foo',
'foo_field',
existing_type=postgresql.JSONB(astext_type=sa.Text()),
nullable=False,
server_default="{}")

我尝试了不同的选项来传递给这个 server_default,例如 text("{}")lambda:{}{}text("SELECT '{}'")。但它似乎只是被忽略了,我得到的只是运行升级时的 IntegrityError :

sqlalchemy.exc.IntegrityError: (psycopg2.IntegrityError) column "foo_field" contains null values [SQL: 'ALTER TABLE foo ALTER COLUMN foo_field SET NOT NULL'] (Background on this error at: http://sqlalche.me/e/gkpj)

代表一个空字典的字符串是否被认为是非空的?应将什么传递给此 server_default?在将字段设置为不可空之前,我是否应该分多个步骤来填充默认值(不是首选选项,我有一堆要应用它的列)?

我正在使用 postgres 10.5,我 read postgres 11 会更好地处理这种操作,我现在应该切换到它吗?

在此先感谢您的帮助/建议

最佳答案

如果有人再来这里,我就用这个

def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.execute("ALTER TABLE {table_name} ALTER COlUMN {column_name} set DEFAULT {new_default_value};")
# ### end Alembic commands ###


def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.execute("ALTER TABLE {table_name} ALTER COlUMN {column_name} set DEFAULT {old_default_value};")
# ### end Alembic commands ###

关于python - Alembic 的 server_default 和 Postgres,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52530690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com