python - 1046, 'No database selected'

MariaDB,数据库名为mydb,setting.py中配置了数据库
执行后出现以下错误,请问怎么修复?

[12/Jul/2017 05:08:19]"GET /info/3895543 HTTP/1.1" 200 21118
Traceback (most recent call last):
  File "/root/ssbc-master/search/models.py", line 115, in list_related
    search_cursor.execute(sql, (string, hash_id, count))
  File "/usr/lib64/python2.7/site-packages/MySQLdb/cursors.py", line 205, in execute
    self.errorhandler(self, exc, value)
  File "/usr/lib64/python2.7/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue
OperationalError: (1046, 'No database selected')

models.py:

#coding: utf8
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=3306, 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=3306, 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_conn = get_conn()
        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()
        search_conn.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)
阅读 6.9k
1 个回答

如果你需要使用setting里配置好的的数据库

from django.db import connections
def get_conn():
    return connections['default']

如果你不使用setting里配的数据库,你应该传递数据库名给connect

mdb.connect('127.0.0.1', 'root', '', '', port=3306, charset='utf8', cursorclass=MySQLdb.cursors.DictCursor)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题