【问题标题】:Set server_default value for relationship table为关系表设置 server_default 值
【发布时间】:2016-03-29 20:49:16
【问题描述】:

我有两个管理员和角色表,通过第三个表assignments(多对多关系)与字段role_idadministrator_id 和一些额外字段created_atupdated_at 连接,我想自动填充:

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}]

有没有办法为assignments 表中的created_atupdated_at 字段设置默认值?

【问题讨论】:

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

标签: postgresql flask sqlalchemy flask-sqlalchemy


【解决方案1】:

它使用defaultonupdate 参数而不是server_defaultserver_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()),

【讨论】:

    【解决方案2】:

    试试这个

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

    【讨论】:

    • 它仍然忽略server_default
    猜你喜欢
    • 2022-08-24
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 2015-12-20
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    相关资源
    最近更新 更多