芹菜任务插入重复数据信息mysql

芹菜任务插入重复数据信息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')

我使用芹菜在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')
    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() 
  • 芹菜任务从远程api获取一些数据
  • 芹菜beat从芹菜后端redis获取芹菜任务结果,然后将结果插入redis
  • 但是在步骤2中,在我将结果数据插入mysql之前,我检查数据是否存在。虽然我做了检查,但仍然会插入重复的数据

    我的代码如下:

    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,谢谢你,我和你有相同的想法,但是我怎么能批准这个呢?