簡體   English   中英

Alembic 的 server_default 和 Postgres

[英]Alembic's server_default and Postgres

我想使用 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,我讀到postgres 11 可以更好地處理此類操作,我現在應該切換到它嗎?

提前感謝您的幫助/建議

您可以使用Rewriter並且自己自動執行。

覆蓋ops.AlterColumnOp操作並返回兩個操作,第一個是具有服務器默認值的更新列操作,第二個是原始op

如果有人再次來到這里,這就是我使用的

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 ###

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM