2016-03-29 31 views
3

我有管理員和角色的兩個表,連接通過第三臺assignments(許多一對多關係)與場role_idadministrator_id和一些額外的領域created_atupdated_at,我想自動填充:設置server_default價值

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

有什麼辦法來設置created_at和默認值assignmentsupdated_at領域?

+1

這工作對我很好。你需要確保你的數據庫實際上在這些列上有默認值,而不是在Python中的'server_default'上指定。 – univerio

+0

@univerio它適用於我的其他模型(不指定數據庫中的默認值),但是當通過多對多關係關係創建錶行時,它只是忽略'server_default' – vero4ka

+1

這就是'server_default'是。它只不過是用於在創建表時指定數據庫中的'DEFAULT'子句的語法。之後它沒有效果。這聽起來像是你在其他列上指定了'default',或者你已經在DB中的那些列上有了'DEFAULT'。 – univerio

回答

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

你能把這個標記爲回答嗎? –

1

試試這個

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

它仍然忽略'server_default'值 – vero4ka