【发布时间】:2021-12-23 18:10:04
【问题描述】:
我有一个 postgresql 数据库,里面有一些简单的表。我使用 flask-sqlalchemy 作为我的 ORM,当我对架构进行更改时,我使用 flask-migrate 进行更新。
如果我使用 DBeaver 查看我的表,我会发现我的大多数表都有一个 serial4 类型的主键。如果我使用 flask-admin 在这些表中创建新条目,它工作正常。 但是,其中两个表将主键显示为 int4,这些不会显示在烧瓶管理界面中,但是如果我尝试添加行,则会收到以下错误:
Integrity error. (psycopg2.errors.NotNullViolation) null value in column "id" of relation "priority" violates not-null constraint DETAIL: Failing row contains (P1, 4, 8, null). [SQL: INSERT INTO priority (priority, respond_by, resolve_by) VALUES (%(priority)s, %(respond_by)s, %(resolve_by)s) RETURNING priority.id] [parameters: {'priority': 'P1', 'respond_by': 4, 'resolve_by': 8}] (Background on this error at: https://sqlalche.me/e/14/gkpj)
我的模型如下所示:
# priority lookup table
class Priority(db.Model):
__tablename__ = 'priority'
id = db.Column(db.Integer, primary_key=True)
priority = db.Column(db.String(2))
respond_by = db.Column(db.Integer) # response time in minutes e.g. created time + this many minutes
resolve_by = db.Column(db.Integer) # resolve in minutes as per above
class Classification(db.Model):
__tablename__ = 'classifications'
id = db.Column(db.Integer, primary_key=True)
service = db.Column(db.String(50))
category = db.Column(db.String(50))
sub_category = db.Column(db.String(50))
selectable = db.Column(db.Boolean())
在这两个分类表中工作正常,它创建了一个 serial4 主键。 Priority 表确实将主键创建为 int4,因此通过 flask-admin 失败。
为什么会这样?我看不出它们之间有什么区别,所以不明白为什么一个用 serial4 主键创建表而另一个没有。
【问题讨论】:
-
附带说明:在现代 Postgres 版本 (>= 10) 中,
serial的使用是 discouraged,有利于符合标准的identity列
标签: python postgresql flask flask-admin