[英]Flask - SQLAlchemy - Add nullable=False column to existing table with data
我正在嘗試向現有表添加一個新的nullable=False
列。 但它不會創建列,因為存在現有行並且該字段是Null
。
這是經典的 22:D。
這是我添加的 model 專欄:
user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
這是我得到的錯誤
sqlalchemy.exc.IntegrityError: (psycopg2.errors.NotNullViolation) column "user_id" contains null values
我嘗試將, default=0
添加到 model 的屬性末尾,希望遷移只會將所有現有行的列值設置為0
,但這沒有任何效果。
我沒有看到任何關於這種看似普遍現象的文檔,所以我想我會問專家。 我錯過了什么?
典型的錯誤消息如下所示。
sqlalchemy.exc.IntegrityError: (psycopg2.errors.NotNullViolation) column "user_id" contains null values
一種解決方法是將現有記錄的外鍵 ID 設置為0
,然后在應用程序代碼中將它們視為None
。 遷移中的升級將如下所示,其中您有兩個表team
和user
,並希望在user
記錄中設置team_id
的默認值:
team = op.create_table(
"team",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("name", sa.Text(), nullable=False),
sa.PrimaryKeyConstraint("id", name=op.f("pk_team")),
)
op.bulk_insert(
team,
[
{"id": 0, "name": "Not Set"},
{"id": 1, "name": "Team 1"},
# ...
{"id": N, "name": "Team N"},
],
)
op.add_column(
"user",
sa.Column("team_id", sa.Integer(), nullable=False, server_default="0"),
)
op.alter_column("user", "team_id", server_default=None)
op.create_foreign_key(
op.f("fk_team_id_user"),
"user",
"team",
["team_id"],
["id"],
onupdate="CASCADE",
ondelete="CASCADE",
)
我可能已經讓孩子和父母交換了,但這應該給你們一些嘗試。
我遇到了和你一樣的問題。 請從另一個線程中查看此評論。 本質上,列定義中的“默認”參數僅由 class 實例使用。 如果您想設置遷移可以解釋的默認值,請使用帶有 SQL 表達式的“server_default”參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.