微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

postgresql – 设置关系表的server_default值

我有两个管理员和角色表,与第三个表分配(多对多关系)连接,字段为role_id,administrator_id和一些额外的字段created_at和updated_at,我想自动填充:

assignments = db.Table('assignments',db.Column('role_id',db.Integer,db.ForeignKey('roles.id')),db.Column('administrator_id',db.ForeignKey('administrators.id')),db.Column('created_at',db.DateTime,server_default=db.func.Now()),db.Column('updated_at',server_default=db.func.Now(),onupdate=db.func.Now()),db.ForeignKeyConstraint(['administrator_id'],['administrators.id']),db.ForeignKeyConstraint(['role_id'],['roles.id'])
)

class Administrator(db.Model,UserMixin):
    __tablename__ = 'administrators'

    id = Column(Integer,primary_key=True,server_default=text("nextval('administrators_id_seq'::regclass)"))
    email = Column(String(255),nullable=False,unique=True,server_default=text("''::character varying"))
    name = Column(String(255))
    surname = Column(String(255))

    roles = db.relationship('Role',secondary=assignments,backref=db.backref('users',lazy='dynamic'))


class Role(db.Model):
    __tablename__ = 'roles'

    id = Column(Integer,server_default=text("nextval('roles_id_seq'::regclass)"))
    name = Column(String(255))

但是当我将一个角色分配给管理员

admin.roles = [role1]
db.session.add(admin)
db.session.commit()

它打破了以下错误

IntegrityError: (psycopg2.IntegrityError) null value in column "created_at" violates not-null constraint
DETAIL:  Failing row contains (1265,19,3,null,null).
[sql: 'INSERT INTO assignments (role_id,administrator_id) VALUES (%(role_id)s,%(administrator_id)s)'] [parameters: {'administrator_id': 19,'role_id': 3}]

有没有办法在赋值表中为created_at和updated_at字段设置认值?

解决方法

它使用default和onupdate参数而不是server_default和server_onupdate:

db.Column('created_at',default=db.func.Now()),default=db.func.Now(),

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐