【问题标题】:Flask - SQLAlchemy - Add nullable=False column to existing table with dataFlask - SQLAlchemy - 将 nullable=False 列添加到包含数据的现有表中
【发布时间】:2019-10-16 04:42:38
【问题描述】:

我正在尝试将新的nullable=False 列添加到现有表中。但它不会创建列,因为存在现有行且字段为Null

这是经典的 catch 22 :D。

这是我添加的模型列:

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 添加到模型中属性的末尾,希望迁移只会将所有现有行的列值设置为0,但这没有任何效果。

我没有看到任何关于这种看似普遍现象的文档,所以我想我会问专家。我错过了什么?

【问题讨论】:

  • 我会修改迁移文件..以可为空的形式添加列,如果为空,则使用 user_id 进行更新,然后将可为空的设置为 false。

标签: python flask flask-sqlalchemy flask-migrate


【解决方案1】:

典型的错误消息如下所示。

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",
    )

我可能已经让孩子和父母互换了,但这应该让你们都可以尝试一下。

【讨论】:

    【解决方案2】:

    我遇到了和你一样的问题。请参阅另一个线程的this comment。本质上,列定义中的“默认”参数仅由类实例使用。如果您想设置迁移可以解释的默认值,请使用带有 SQL 表达式的“server_default”参数。

    【讨论】:

      猜你喜欢
      • 2017-12-07
      • 1970-01-01
      • 2011-12-14
      • 1970-01-01
      • 1970-01-01
      • 2018-02-27
      • 2019-08-11
      • 2017-02-16
      • 2015-12-19
      相关资源
      最近更新 更多