[英]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.