在我的结果中重复记录

时间:2016-11-15 11:37:27

标签: mysql flask-sqlalchemy

我的模型定义如下

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()

和bellow在我的数据库中捕获我的结果。 enter image description here

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

1 个答案:

答案 0 :(得分:0)

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)