Я хотел бы запустить миграцию с использованием 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)
Считается ли строка, представляющая пустой dict, ненулевой?Что следует передать этому server_default
?Должен ли я разделить код на несколько шагов, чтобы заполнить значение по умолчанию перед установкой поля, не допускающего значения NULL (не предпочтительный вариант, у меня есть несколько столбцов, к которым я хочу применить это)?10.5, я читаю , что postgres 11 будет лучше справляться с подобной операцией, стоит ли сейчас переходить на нее?
Заранее спасибо за помощь / советы