簡體   English   中英

Flask - SQLAlchemy - 將 nullable=False 列添加到包含數據的現有表

[英]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 遷移中的升級將如下所示,其中您有兩個表teamuser ,並希望在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.

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