重复记录
问题描述:
我的模型定义了这样重复记录
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()
在我看来,就只是一个具有相同IMEI,年份和周纪录,但在我的项目可能有许多重复的记录有相同的IMEI,年份和星期。我真的很困惑。我的数据库是MySQL 5.6。
答
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
为什么您可以设定每列主键? – num8er
我只是想让它们成为联合主键,根据文档允许它们。 – Allan
主键是允许的,但对于SQL数据库是不正确的。在你的代码中为每一列创建PK-s(: – num8er