【发布时间】:2021-03-11 01:48:12
【问题描述】:
在我的数据库模型中,我需要 userId 和 forumPostId 作为复合主键。但我需要 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