mysql - Python Commands Out of Sync error

偶尔出现下边情况,请问是什么原因,怎么修复啊?

错误提示:Commands out of sync, you can't run the command now

code:

import json
    import re
    import traceback
    import binascii
    import time

    from django.db import models
    import MySQLdb as mdb
    import MySQLdb.cursors


    search_conn = mdb.connect('127.0.0.1', 'root', '', '', port=9306, charset='utf8', cursorclass=MySQLdb.cursors.DictCursor)
    search_conn.ping(True)
    re_punctuations = re.compile(
        ur"。|,|,|!|…|!|《|》||\"|'|:|:|?|\?|、|\||“|”|‘|’|;|\\|—|_|=|(|)|·|\(|\)| |\.|【|】|『|』|@|&|%|\^|\*|\+|\|||~|`|\[|\]")

    def get_conn():
        return mdb.connect('127.0.0.1', 'root', '', '', port=9306, charset='utf8', cursorclass=MySQLdb.cursors.DictCursor)

    def escape_string(string):
        return re.sub(r"(['`=\(\)|\-!@~\"&/\\\^\$])", r"\\\1", string)

    def split_words(string):
        string = re_punctuations.sub(u' ', string).replace(u'-', u' ')
        words = []
        for w in string.split():
            try:
                words.append(w.encode('ascii').decode('ascii'))
            except:
                for c in w:
                    words.append(c)
        return u'|'.join(words).strip(u'|')


    class HashManager(models.Manager):
        def search(self, keyword, start=0, count=10, category=None, sort=None):
            search_cursor = search_conn.cursor()
            sql = '''SELECT id FROM rt_main'''
            conds = []
            values = []
            if keyword:
                conds.append('MATCH(%s)')
                values.append(escape_string(keyword))
            if category:
                conds.append('category=%s')
                values.append(binascii.crc32(category)&0xFFFFFFFFL)
            if conds:
                sql += ' WHERE ' + ' AND '.join(conds)
            if sort == 'create_time':
                sql += ' ORDER BY create_time DESC '
            elif sort == 'length':
                sql += ' ORDER BY length DESC '
            sql += '''
                LIMIT %s,%s
                OPTION max_matches=1000, max_query_time=60
            '''
            search_cursor.execute(sql, values + [start, count])
            items = list(search_cursor.fetchall())
            search_cursor.execute('SHOW META')
            meta = {}
            for d in search_cursor.fetchall():
                meta[d['Variable_name']] = d['Value']
            sql = '''SELECT category, COUNT(*) AS num FROM rt_main '''
            if conds:
                sql += ' WHERE ' + ' AND '.join(conds)
            sql += ''' GROUP BY category OPTION max_query_time=60'''
            search_cursor.execute(sql, values)
            cats = list(search_cursor.fetchall())

            res = {
                'result': {
                    'items': items,
                    'meta': meta,
                },
                'cats': {
                    'items': cats,
                },
            }
            search_cursor.close()
            return res

        def list_with_files(self, ids):
            res = []
            if len(ids[0]) == 40:
                items = Hash.objects.filter(info_hash__in=ids).values()
            else:
                items = Hash.objects.filter(id__in=ids).values()
            res = list(items)
            items = FileList.objects.filter(info_hash__in=[x['info_hash'] for x in res]).values()
            for x in res:
                for y in items:
                    if x['info_hash'] == y['info_hash']:
                        try:
                            x['files'] = json.loads(y['file_list'])
                        except ValueError:
                            pass
            items = Extra.objects.filter(hash_id__in=ids).values()
            for x in res:
                for y in items:
                    if x['id'] == y['hash_id']:
                        x['extra'] = y
            return res

        def list_related(self, hash_id, name, count=10):
            string = split_words(name)
            if not string:
                return []
            search_conn = get_conn()
            search_cursor = search_conn.cursor()
            try:
                sql = '''SELECT id FROM rt_main WHERE MATCH(%s) AND id%s LIMIT 0,%s OPTION max_matches=1000, max_query_time=10'''
                search_cursor.execute(sql, (string, hash_id, count))
                ids = [x['id'] for x in search_cursor.fetchall()]
                items = Hash.objects.only('name', 'length', 'create_time', 'id').filter(id__in=ids).values()
            except:
                traceback.print_exc()
                items = []
            search_cursor.close()
            search_conn.close()
            return items


    class Hash(models.Model):
        objects = HashManager()

        info_hash = models.CharField(max_length=40, unique=True)
        category = models.CharField('类别', max_length=20)
        data_hash = models.CharField('内容签名', max_length=32)
        name = models.CharField('资源名称', max_length=255)
        extension = models.CharField('扩展名', max_length=20)
        classified = models.BooleanField('是否分类', default=False)
        source_ip = models.CharField('来源IP', max_length=20, null=True)
        tagged = models.BooleanField('是否索引', default=False, db_index=True)
        length = models.BigIntegerField('文件大小')
        create_time = models.DateTimeField('入库时间')
        last_seen = models.DateTimeField('上次请求时间')
        requests = models.PositiveIntegerField('请求次数')
        comment = models.CharField(max_length=255, null=True)
        creator = models.CharField(max_length=20, null=True)

        def __unicode__(self):
            return self.name

        def is_blacklisted(self):
            try:
                return self.extra.status == 'disabled'
            except:
                return False


    class Extra(models.Model):
        STATUS = (
            ('', 'Normal'),
            ('reviewing', 'Reviewing'),
            ('disabled', 'Disabled'),
            ('deleted', 'Deleted'),
        )
        hash = models.OneToOneField(Hash)
        status = models.CharField('Status', choices=STATUS, max_length=20)
        update_time = models.DateTimeField('更新时间', auto_now=True)


    class FileList(models.Model):
        info_hash = models.CharField(max_length=40, primary_key=True)
        file_list = models.TextField('JSON格式的文件列表')

        def __unicode__(self):
            return self.info_hash


    class StatusReport(models.Model):
        date = models.DateField('日期', unique=True)
        new_hashes = models.IntegerField('新增资源')
        total_requests = models.IntegerField()
        valid_requests = models.IntegerField()

        def __unicode__(self):
            return u'%s - %s' % (self.date, self.new_hashes)


    class RecKeywords(models.Model):
        keyword = models.CharField('推荐关键词', max_length=20)
        order = models.PositiveIntegerField('排序', default=0)

        def __unicode__(self):
            return u'%s %s' % (self.keyword, self.order)


    class ContactEmail(models.Model):
        mail_from = models.CharField('Mail From', max_length=100)
        subject = models.CharField('Subject', max_length=200)
        text = models.TextField('Text')
        receive_time = models.DateTimeField(auto_now_add=True)
        is_complaint = models.BooleanField(default=False)
阅读 1.7k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题