2016-11-15 231 views
0

我的模型定義了這樣重複記錄

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

回答

0

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