在Flask SQLAlchemy关联表中保存重复条目

时间:2014-03-20 18:30:40

标签: python sql flask flask-sqlalchemy

我正在设计一个模式来审核哪个用户有哪些监视器。

对于给定的审核,我们有用户。每个用户可以拥有零个或多个监视器。

此外,用户可以拥有许多相同的显示器。

这是我的用户类:

class User(db.Model):
    id = db.Column(db.Integer, db.Sequence('user_id_seq'), 
                   autoincrement=True, primary_key=True)

    login = db.Column(db.String(140), unique=True)

    def __init__(self, login):
        self.login = login

    def __repr__(self):
        return '<User %r>' % self.login

这是我的审计课:

class Audit(db.Model):
    id = db.Column(db.Integer, db.Sequence('audit_id_seq'), 
                   autoincrement=True, primary_key=True)

    start_date = db.Column(db.DateTime)
    end_date = db.Column(db.DateTime)

    def __init__(self):
        self.start_date  = datetime.now()

    def __repr__(self):
        return '<Audit %r>' % self.id

这是我的Monitor类:

class Monitor(db.Model):
    id = db.Column(db.Integer, db.Sequence('monitor_id_seq'), 
                   autoincrement=True, primary_key=True)

    description = db.Column(db.String(140), unique=True)

    def __init__(self, description):
        self.description = description

    def __repr__(self):
        return '<Monitor %r>' % self.description

这是我的UserAudit类:

class UserAudit(db.Model):
    id = db.Column(db.Integer, db.Sequence('user_audit_id_seq'), 
                   autoincrement=True, primary_key=True)

    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    user = db.relationship('user',
        backref=db.backref('user_audits', lazy='dynamic'))

    audit_id = db.Column(db.Integer, db.ForeignKey('audit.id'))
    audit = db.relationship('Audit')

    monitors = db.relationship('Monitor', 
                                secondary=userAuditMonitor.association_table,
                                backref='user_audit_monitors')

    def __init__(self, user, audit):
        self.user = user
        self.audit = audit

    def __repr__(self):
        return '<UserAudit %r>' % self.id 

最后,这是我的UserAuditMonitor类,它将整个事物粘合在一起:

class UserAuditMonitor():
    association_table = Table('user_audit_monitor', db.Model.metadata,
        Column('user_audit_id', db.Integer, db.ForeignKey('user_audit.id')),
        Column('monitor_id', db.Integer, db.ForeignKey('monitor.id'))
    )

上面的关联表非常有用,因为我可以简单地使用.append()方法并向UserAudit sqlalchemy对象添加更多监视器。

示例:

>>> u = UserAudit.query.get(1)
>>> monitors = [Monitor.query.get(3), Monitor.query.get(4)]
>>> u.append(monitors)
>>> print u.monitors
[<Monitor u'HP'>, <Monitor u'Dell'>]
>>> db.session.commit()
>>> print u.monitors
[<Monitor u'HP'>, <Monitor u'Dell'>]

但是,如果我尝试将多个相同的监视器附加到UserAudit对象,则只存储一个监视器。

示例:

>>> u = UserAudit.query.get(2)
>>> monitors = [Monitor.query.get(3), Monitor.query.get(3)]
>>> u.append(monitors)
>>> print u.monitors
[<Monitor u'HP'>, <Monitor u'HP'>]
>>> db.session.commit()
>>> print u.monitors
[<Monitor u'HP'>] # ONLY ONE MONITOR GOT SAVED HERE!!!

如何配置UserAuditMonitor类以保存重复项?

谢谢!

1 个答案:

答案 0 :(得分:1)

我的猜测是UserAuditMonitor没有明确定义的主键,因此SQLA使用user_audit_id x monitor_id作为键并重复删除关系。也许尝试将自动增量主键添加到association_table