Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 为关系表设置服务器默认值_Postgresql_Flask_Sqlalchemy_Flask Sqlalchemy - Fatal编程技术网

Postgresql 为关系表设置服务器默认值

Postgresql 为关系表设置服务器默认值,postgresql,flask,sqlalchemy,flask-sqlalchemy,Postgresql,Flask,Sqlalchemy,Flask Sqlalchemy,我有两个用于管理员和角色的表,将第三个表assignments(多对多关系)与字段role\u id、administrator\u id和一些额外字段连接起来,我想自动填充这些字段: assignments = db.Table('assignments', db.Column('role_id', db.Integer, db.ForeignKey('roles.id')), db.Column('administrator_id', db.Integer,

我有两个用于管理员和角色的表,将第三个表
assignments
(多对多关系)与字段
role\u id
administrator\u id
和一些额外字段
连接起来,我想自动填充这些字段:

assignments = db.Table('assignments',
    db.Column('role_id', db.Integer, db.ForeignKey('roles.id')),
    db.Column('administrator_id', db.Integer,
              db.ForeignKey('administrators.id')),
    db.Column('created_at', db.DateTime, server_default=db.func.now()),
    db.Column('updated_at', db.DateTime, 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, primary_key=True, 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}]
有没有办法为
工作分配
表中的
已创建字段和
已更新字段设置默认值

db.Column('created_at', db.DateTime, server_default=text("now()"))

它使用
default
onupdate
参数,而不是
server\u default
server\u onupdate

db.Column('created_at', db.DateTime, default=db.func.now()),
db.Column('updated_at', db.DateTime, default=db.func.now(),
          onupdate=db.func.now()),

这对我来说很好。您需要确保您的数据库在这些列上实际上有一个默认值,而不仅仅是在Python中的
server\u default
上指定的。@univerio它适用于我的其他模型(不在数据库中指定默认值),而是当通过多对多关系创建表行时,它只是忽略了
server\u默认值
,这就是
server\u默认值
。它只不过是在创建表时在数据库中指定一个
DEFAULT
子句的语法而已。之后就没有效果了。听起来好像您在其他列上指定了
default
,或者在数据库中的这些列上已经有了
default
。它仍然忽略
server\u default