mysql - 我的结果中有重复记录

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

下面是在我的数据库中捕获我的结果。 enter image description here

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

最佳答案

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

2)不需要在每个字段上建立索引,尤其是在统计表上 - 它会使插入、更新速度变慢,因为每次数据库引擎都会重新索引。

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)

关于mysql - 我的结果中有重复记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40608905/

相关文章:

mysql - 分层 MySQL Assets 跟踪的最佳实践

mysql - 显示名称 mysql 中包含 "and"的发布者列表

php - 如何使用 IF 语句使用 CSV 中的值填充列

匹配逗号分隔列表的 mySQL 模式

python - 我可以在 SQLAlchemy 中添加一个基于另一个数据库行的新项目吗?

python - 通过引用将数据添加到 wtforms

mysql - 如何使用单个查询获取存储在不同变量中的多个表行的计数?

python - 如何将行插入表 sqlalchemy 对象?

flask - 在开发和部署中使用 Flask-Migration

inheritance - SQLAlchemy 和过滤多态查询