Сервер Алембика по умолчанию и Постгрес - PullRequest
0 голосов
/ 27 сентября 2018

Я хотел бы запустить миграцию с использованием 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 будет лучше справляться с подобной операцией, стоит ли сейчас переходить на нее?

Заранее спасибо за помощь / советы

1 Ответ

0 голосов
/ 16 октября 2018

вы можете использовать Rewriter и делать это самостоятельно.

переопределить операцию ops.AlterColumnOp и вернуть две операции, первая из которых - операция обновления столбца со значением по умолчанию сервераа второй оригинал op.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...