首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >关系"id“列中的SQLAlchemy错误'(psycopg2.errors.NotNullViolation)空值

关系"id“列中的SQLAlchemy错误'(psycopg2.errors.NotNullViolation)空值
EN

Stack Overflow用户
提问于 2022-11-11 03:46:36
回答 2查看 55关注 0票数 1

我知道有一个类似的问题,如何修复错误:(psycopg2.errors.NotNullViolation)列"id“中的空值违反了null约束?,但是答案并没有纠正我的错误。

我有以下sqlalchemy结构连接到postgres数据库

代码语言:javascript
复制
class Injury(db.Model):
    __tablename__ = "injury"

    id = Column(Integer, primary_key=True)
    name = Column(String)
    description = Column(String)

DDL看起来就像

代码语言:javascript
复制
create table injury
(
    id               bigint not null
        constraint idx_182837_injury_pkey
            primary key
        constraint injury_id_key
            unique,
    name             text,
    description      text,
);

但是,在尝试向数据库中插入一些内容时,如

代码语言:javascript
复制
injury = Injury(name='name', description='desc')
session.add(injury)
session.commit()

发生下列错误

代码语言:javascript
复制
Error '(psycopg2.errors.NotNullViolation) null value in column "id" of relation "injury" violates not-null constraint

在打开调试器时,我可以在提交之前验证injury对象中的injury属性是None

为什么会发生这种事?我的模式中的primary_key=True不应该告诉postgres它负责创建id吗?我试着玩SEQUENCEIDENTITY,但是我也犯了同样的错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-11 14:21:20

这是我在使用pg_loader时从sqlite到postgres的某种形式的bug的结果。我发现另一个人,遇到这种情况和我遵循他们的指示,它纠正了我的问题。以下步骤都是在IntelliJ的数据库工具中完成的

  • 用pg_dump导出我所有的数据
  • 重新格式化我的id模式,使其类似于id = Column(Integer, Identity(start=2116), primary_key=True),其中2116比我目前数据库中的最后一个id多一个。
  • 用pg_loader重新加载数据库

这是在没有Identity字段的情况下工作的,但是键被设置为1,而不是2116。看看这篇文章,我意识到我需要使用Identity字段。

票数 0
EN

Stack Overflow用户

发布于 2022-11-11 03:58:13

你必须告诉它自动增量不是使用bigint而是串行

代码语言:javascript
复制
id SERIAL PRIMARY KEY

检查这个how-to-define-an-auto-increment-primary-key-in-postgresql-using-python

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74397817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档