【问题标题】:Auto increment non primary column in SQLAlchemySQLAlchemy中的自动递增非主列
【发布时间】:2021-03-11 01:48:12
【问题描述】:

在我的数据库模型中,我需要 userIdforumPostId 作为复合主键。但我需要 id 是一个自动递增的值。但是当我试图在表中插入新行时,在 id 中获取 none 而不是自动递增的整数。

class ForumPostFollow(db.Model):
    __tablename__ = "forum_post_follow"
    id = db.Column(db.Integer,autoincrement=True,nullable=False,unique=True)
    userId = db.Column(db.Integer,db.ForeignKey('user.id'),primary_key=True)
    forumPostId = db.Column(db.Integer,db.ForeignKey('forum_post.id'),primary_key=True)
    active = db.Column(db.Boolean,nullable=False)

我的包版本

Flask-SQLAlchemy==2.3.2 SQLAlchemy>=1.3.0

这个问题类似于this question。但它适用于 1.1 版

更新问题

我已经从终端更改了我的 id 列序列

ALTER TABLE forum_post_follow DROP COLUMN id;
ALTER TABLE forum_post_follow ADD COLUMN id SERIAL;

那么我修改后的列是这样的

但还是出现同样的错误

sqlalchemy.exc.IntegrityError: (psycopg2.errors.NotNullViolation) null value in column "id" violates not-null constraint
DETAIL:  Failing row contains (1, 1, t, null).

[SQL: INSERT INTO forum_post_follow (id, "userId", "forumPostId", active) VALUES (%(id)s, %(userId)s, %(forumPostId)s, %(active)s)]
[parameters: {'id': None, 'userId': 1, 'forumPostId': 1, 'active': True}]

【问题讨论】:

  • 见这里autoincrement。除非列是primary key 的一部分,或者您已在服务器上手动将字段设置为serial/IDENTITY,否则它基本上不会起作用。
  • @AdrianKlaver 你能看看我更新的问题吗
  • 'id': None 表示您正在尝试将NULL 传递到id 列。这会触发NOT NULL 约束。将id 字段排除在INSERT 之外,Postgres 将自动添加该值。
  • @AdrianKlaver 我和这个问题的作者有同样的问题。和你有同样的想法。但是如何省略 id 字段?在使用 session.add(db_obj) 之前,我尝试了这个“del db_obj ['id']”。不幸的是,这给了我以下错误:“'Job' 对象不支持删除项目”
  • @Jabb 需要自己的问题,因为您需要提供有关您的模型、查询、表架构、SQLAlchemy 版本等的更多信息。

标签: postgresql orm sqlalchemy flask-sqlalchemy


【解决方案1】:

我遇到了类似的问题,发现按照SQLAlchemy 1.3 Documentation

对于不需要默认生成IDENTITY 的情况,请在第一个整数主键列上为Column.autoincrement 标志指定False

所以你可能想试试这个:

class ForumPostFollow(db.Model):
    __tablename__ = "forum_post_follow"
    id = db.Column(db.Integer,autoincrement=False,primary_key=True,nullable=False,unique=True)
    userId = db.Column(db.Integer,db.ForeignKey('user.id'),primary_key=True)
    forumPostId = db.Column(db.Integer,db.ForeignKey('forum_post.id'),primary_key=True)
    active = db.Column(db.Boolean,nullable=False)

【讨论】:

  • 一张表不应该只有一个primary_key吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-09
  • 1970-01-01
  • 1970-01-01
  • 2023-01-08
  • 1970-01-01
  • 2020-07-18
  • 2011-09-02
相关资源
最近更新 更多