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(),

相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...