Django的ORM使用记录_3


=Start=

缘由:

在使用的过程中记录一下Django的ORM知识/技巧,一来可以加深印象,同时也为方便以后参考。

正文:

1.在Django的ORM中如何访问存储过程?
from django.db import connection
cursor = connection.cursor()
cursor.execute("SQL STATEMENT CAN BE ANYTHING")
#cursor.fetchone()
cursor.fetchall()
2.对象关系映射器
3.为什么Django的ORM比原生的MySQLdb慢?

在大查询下,比如报表业务,不建议使用ORM,因为速度比较慢,原因在于:它会把结果转换成QuerySet结构,而不是直接返回;所以这时可以考虑用原生的SQL语句。

在Python下可以选择 MySQLdb ,也可以用Django的connection/connections。推荐用connection/connections,因为数据库配置等信息都已经放在了settings.py里面。

from django.db import connection, transaction
import MySQLdb
# ...
cursor = connection.cursor(cursorclass = MySQLdb.cursors.DictCursor)
cursor.execute(sql, None)

# 如果你有多个数据库,可以在connections中选择数据库:
from django.db import connections
cursor = connections['crazyof'].cursor()

transaction.commit_unless_managed(using='crazyof')
4.获取Django ORM query执行的的SQL语句
# 方法一
queryset = MyModel.objects.all()
print 'Query SQL: {0}'.format(queryset.query)

# 方法二(debug=True)
from django.db import connections
print connections['default'].queries

# 方法三
# 利用三方提供的 middleware 来实现,参考: https://djangosnippets.org/snippets/290/
# 是插拔式的,不需要的时候在 settings.py 中去掉这个middleware就可以了,不过这只能在debug 模式下使用
5.在Django的ORM中如何判断查询结果是否为空
my_queryset = Booking.objects.filter(date_select='2011-12-2')

#方法一 .exists()
if my_queryset.exists():
    print "QuerySet has Data"
else:
    print "QuerySet is empty"
#方法二 .count()==0
if my_queryset.count() == 0:
    print "empty"
#方法三
if my_queryset:
    print "QuerySet has Data"
else:
    print "QuerySet is empty"

总结:
QuerySet.exists() > QuerySet.count()==0 > QuerySet
6.在Python的MySQLdb模块中如何判断查询结果是否为空
cursor = connections['security'].cursor()
if sql_params:
    cursor.execute(sql_str, sql_params)
else:
    cursor.execute(sql_str)

if cursor.rowcount:
    aaData = []
    for item in cursor:
        aaData.append(list(item))
    return JsonResponse({'aaData': aaData})
else:
    return JsonResponse({'aaData': []})
7.待添加

……

=END=

, ,

《 “Django的ORM使用记录_3” 》 有 4 条评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注