鍍金池/ 問(wèn)答/Java  Python  數(shù)據(jù)庫(kù)  HTML/ 為什么 django 通過(guò) queryset 的一次簡(jiǎn)單數(shù)據(jù)庫(kù)操作花費(fèi)時(shí)間那么長(zhǎng)

為什么 django 通過(guò) queryset 的一次簡(jiǎn)單數(shù)據(jù)庫(kù)操作花費(fèi)時(shí)間那么長(zhǎng)?

clipboard.png

如圖所示,簡(jiǎn)單的增和查操作,花費(fèi)時(shí)間長(zhǎng)達(dá)1秒 [環(huán)境:windows + python3 + django2 ]。(PS:數(shù)據(jù)量也不多,todo_list 只有2行數(shù)據(jù),依然這么慢)

def get(request):
    # /todo/list 接口處理函數(shù)
    todo_list = list( Todo.objects.all().values('name') )

    return JsonResponse({
        'code': 0,
        'data':   todo_list
    })

@post_method
def add(request):
    # /todo/add 接口處理函數(shù)
    item = Todo.objects.create(name=request.POST['name'])
    return JsonResponse({
        'code': 0,
        'msg': 'add successfully.'
    })

數(shù)據(jù)庫(kù)用的mysql, 用默認(rèn)的 sqlite3 的話則不會(huì)那么慢

# settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'ops_chart',
        'USER': 'root',
        'PASSWORD': 'xxxxxx',
        'HOST': 'localhost',
        'PORT': '3306',

        'OPTIONS': {
            'sql_mode': 'STRICT_TRANS_TABLES'
        }
    }
}
回答
編輯回答
巫婆

一般像django和java的hibernate有些相似,它并不會(huì)走捷徑。而在真實(shí)情況下自己寫sql,就可以簡(jiǎn)化sql。而是查詢他需要把對(duì)象轉(zhuǎn)sql,返回在把sql轉(zhuǎn)對(duì)象,其實(shí)就跟電腦一樣,它是一個(gè)好學(xué)生,但是它并不聰明,只是你教會(huì)它怎么做,它會(huì)重復(fù)做你教它的事,你沒(méi)教它就不會(huì)。
順便放兩組,查看執(zhí)行sql的方法,多讀讀官方的文檔,它會(huì)告訴你為什么的

print Province.objects.all().query
from core.models import Province
from django.db import connection
p = Province(name=u'河南', code='0371')
p.save()
2017年10月20日 03:11
編輯回答
壞脾滊

開(kāi)的debug吧

2018年2月24日 06:05
編輯回答
黑與白

說(shuō)是數(shù)據(jù)庫(kù)操作慢,你連用的是啥數(shù)據(jù)庫(kù)也不交代一下嗎?

剛看到,是mysql;直接訪問(wèn)一下呢,看看對(duì)比如何?

2017年12月1日 09:29
編輯回答
空白格

調(diào)試過(guò),發(fā)現(xiàn)sql語(yǔ)句執(zhí)行的耗時(shí)并不長(zhǎng)。
后來(lái)發(fā)現(xiàn),

連接 windows 的mysql服務(wù)會(huì)很慢(1s左右),
連接 linux 的mysql服務(wù)就在正常范疇內(nèi)了(100ms左右)。

問(wèn)題解決,但原因未明。難道是與windows本地的mysql服務(wù)建立連接會(huì)比較慢?

2018年4月29日 04:19