芹菜任务插入重复数据信息mysql
我使用芹菜在python中归档异步作业,我的代码流如下:芹菜任务插入重复数据信息mysql,mysql,duplicates,celery,Mysql,Duplicates,Celery,我使用芹菜在python中归档异步作业,我的代码流如下: def get_task_result(logger=None): db = MySQLdb.connect(host=MYSQL_HOST, port=MYSQL_PORT, user=MYSQL_USER, passwd=MYSQL_PASSWD, db=MYSQL_DB, cursorclass=MySQLdb.cursors.DictCursor, use_unicode=True, charset='utf8')
def get_task_result(logger=None):
db = MySQLdb.connect(host=MYSQL_HOST, port=MYSQL_PORT, user=MYSQL_USER, passwd=MYSQL_PASSWD, db=MYSQL_DB, cursorclass=MySQLdb.cursors.DictCursor, use_unicode=True, charset='utf8')
cursor = db.cursor()
....
....
store_subdomain_result(db, cursor, asset_id, celery_task_result)
....
....
cursor.close()
db.close()
query_subdomain_sql = f'SELECT * FROM nw_asset WHERE domain="{domain}"'
cursor.execute(query_subdomain_sql)
sub_domain_result = cursor.fetchone()
def get_task_result(logger=None):
db = MySQLdb.connect(host=MYSQL_HOST, port=MYSQL_PORT, user=MYSQL_USER, passwd=MYSQL_PASSWD, db=MYSQL_DB, cursorclass=MySQLdb.cursors.DictCursor, use_unicode=True, charset='utf8')
cursor = db.cursor()
....
....
store_subdomain_result(db, cursor, asset_id, celery_task_result)
....
....
cursor.close()
db.close()
query_subdomain_sql = f'SELECT * FROM nw_asset WHERE domain="{domain}"'
cursor.execute(query_subdomain_sql)
sub_domain_result = cursor.fetchone()
我首先选择数据是否存在,如果数据不存在,我会进行插入,代码如下:
def get_task_result(logger=None):
db = MySQLdb.connect(host=MYSQL_HOST, port=MYSQL_PORT, user=MYSQL_USER, passwd=MYSQL_PASSWD, db=MYSQL_DB, cursorclass=MySQLdb.cursors.DictCursor, use_unicode=True, charset='utf8')
cursor = db.cursor()
....
....
store_subdomain_result(db, cursor, asset_id, celery_task_result)
....
....
cursor.close()
db.close()
query_subdomain_sql = f'SELECT * FROM nw_asset WHERE domain="{domain}"'
cursor.execute(query_subdomain_sql)
sub_domain_result = cursor.fetchone()
我这样做,但它仍然插入重复的数据,我不能理解这一点
我在谷歌上搜索了这个问题,有人说使用插入忽略或关系到或唯一索引,但我想知道为什么代码不能按预期工作
另外,在我看来,我认为如果mysql中有一些缓存,当我进行选择时,数据并没有真正进入mysql,只是在刷新时,所以选择将返回none?使列域唯一,那么您将不会多次获得域。您可以查看Insert into duplicate,但这仅在新行完成时有效duplicate@nbk,我知道你所说的解决方案,但我也想知道为什么我的代码无法在那里工作,我只能推测,在你选择之后,插入之前,另一个线程已经进入了域。mysql有一种机制,可以接收所有传入的请求并将其放入队列中,我认为这种情况会发生。但是你应该从一开始就让那个专栏独一无二。@nbk,谢谢你,我和你有相同的想法,但是我怎么能批准这个呢?让专栏域独一无二,那么你永远不会得到一个域超过一次。您可以查看Insert into duplicate,但这仅在新行完成时有效duplicate@nbk,我知道你所说的解决方案,但我也想知道为什么我的代码无法在那里工作,我只能推测,在你选择之后,插入之前,另一个线程已经进入了域。mysql有一种机制,可以接收所有传入的请求并将其放入队列中,我认为这种情况会发生。但是你应该从一开始就让这个专栏独一无二。@nbk,谢谢你,我和你有相同的想法,但是我怎么能批准这个呢?