今天在對一些抓取到的數據做插入的時候,因為使用了定時器,每間隔幾分鍾會抓取一次,導致很多數據插入的是重復數據,為了解決這個問題,
一般是在插入之前先通過一個標識去查詢表數據看是否已經有了,沒有再執行插入操作
一開始我的做法是,執行兩次sql語句操作,先select,再insert
let result = await this.app.mysql.select('tb_news_topic', {
where: { order: list.data[i].order }
});
if (!result[0]){
await this.app.mysql.insert('tb_news_topic', {
title: list.data[i].title,
summary: list.data[i].summary,
url: '',
order: list.data[i].order,
publishDate: new Date(list.data[i].publishDate),
createdAt: this.app.mysql.literals.now//當前時間
});
}
以上做法,雖然能實現功能達到目的,但感覺不太優雅,效率比較低,后來了解到mysql支持直接寫sql語句做判斷,通過查詢表數據是否存在,不存在則執行插入操作
INSERT INTO tb_news_topic(title,summary) SELECT '218',
'XQ33019920170811142528217' FROM DUAL WHERE NOT EXISTS(SELECT *
FROM tb_news_topic WHERE title = '111')
語法
INSERT INTO table(field1, field2, fieldn) SELECT 'field1',
'field2', 'fieldn' FROM DUAL WHERE NOT EXISTS(SELECT field FROM
table WHERE field = ?)
修改代碼,改成sql語句直接判斷
for (let i = 0; i < list.data.length;i++){
let sql = `INSERT INTO tb_news_topic(title,summary,url,topic_order,publishDate,createdAt) SELECT ?,
?,?,?,?,? FROM DUAL WHERE NOT EXISTS(SELECT *
FROM tb_news_topic WHERE title = ?)`
// 直接執行sql語句
const results = await this.app.mysql.query(sql, [list.data[i].title,
list.data[i].summary,
'',
list.data[i].order,
new Date(list.data[i].publishDate),
this.app.mysql.literals.now,//當前時間
list.data[i].title
]);
}
另外,這里碰到了個問題,通過foreach遍歷數組的時候,foreach里面不能使用await ,所在這個地方我用的for循環對數組進行遍歷