重复记录

问题描述:

我的模型定义了这样重复记录

class UserAppWeekStatistics(db.Model): 
__tablename__ = 'user_app_week_statistics' 
id = db.Column(db.Integer, primary_key=True) 
imei = db.Column(db.String(15), primary_key=True, index=True) 
year = db.Column(db.Integer, primary_key=True, 
       default=int(datetime.now().strftime('%Y')), index=True) 
week = db.Column(db.Integer, primary_key=True, 
       default=int(datetime.now().strftime('%W')), index=True) 
count = db.Column(db.Integer, default=0) 

def __repr__(self): 
    return '<UserAppWeekStatistics %r-%r-%r>' % (self.imei, self.year, self.week) 

,在我的观点

user_app_week_statistics = UserAppWeekStatistics.query.filter_by(imei=json_req['imei'], 
                   year=int(datetime.now().strftime('%Y')), 
                   week=int(datetime.now().strftime('%W'))).first() 
if user_app_week_statistics is None: 
    user_app_week_statistics = UserAppWeekStatistics() 
    user_app_week_statistics.imei = json_req['imei'] 
    user_app_week_statistics.count = 1 
else: 
    user_app_week_statistics.count += 1 
db.session.add(user_app_week_statistics) 
db.session.commit() 

和波纹管是捕捉我的成绩在我的数据库。 enter image description here

在我看来,就只是一个具有相同IMEI,年份和周纪录,但在我的项目可能有许多重复的记录有相同的IMEI,年份和星期。我真的很困惑。我的数据库是MySQL 5.6。

+0

为什么您可以设定每列主键? – num8er

+0

我只是想让它们成为联合主键,根据文档允许它们。 – Allan

+0

主键是允许的,但对于SQL数据库是不正确的。在你的代码中为每一列创建PK-s(: – num8er

1)修复你的模型,只能有1 primary_key

2)在每个字段上都不需要index,尤其是在统计表上 - 它使插入,更新速度更慢,每次数据库引擎重新编制索引时都会更新。

3)添加独特的复合索引来防止重复。

终于在这里为您的型号:

class UserAppWeekStatistics(db.Model): 
    __tablename__ = 'user_app_week_statistics' 
    id = db.Column(db.Integer, primary_key=True) 
    imei = db.Column(db.String(15), index=True) 
    year = db.Column(db.Integer, default=int(datetime.now().strftime('%Y'))) 
    week = db.Column(db.Integer, default=int(datetime.now().strftime('%W'))) 
    count = db.Column(db.Integer, default=0) 

    # add this 
    __table_args__ = db.UniqueConstraint('imei', 'year', 'week', name='uq_user_app_week_statistics_imei_year_week') 

    def __repr__(self): 
    return '<UserAppWeekStatistics %r-%r-%r>' % (self.imei, self.year, self.week) 
+1

谢谢。我会试试这个。 – Allan