Django中如何直接执行SQL语句

 更新时间:2023年08月24日 09:55:34   作者:程序员学编程  
这篇文章主要介绍了Django中如何直接执行SQL语句问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Django直接执行SQL语句

今天在django views.py看到同事写的代码里面有段关于数据库查询的语句。

因为涉及多个表的查询,所以django 的models的查询无法满足需求,所以直接执行了SQL语句。

他是按照下面的方法实现的。

    try:
        connection = MySQLdb.connect(host=SQL_IP,
                                     user=SQL_USER,
                                     passwd=SQL_PASSWD,
                                     db=SQL_DB, charset='utf8')
        cursor = connection.cursor()
        cmd_query = query_data(request)
        data_sort = sort_data(request)
        cmd = "set session group_concat_max_len = 8000;"
        cursor.execute(cmd)
        ......

看到这段代码,感觉应该重复造了轮子,数据库的链接应该交由django这个框架处理的。于是查看了下官方文档。

django.db.connection 就是上面的同事写的那个connection了。

后面的方法同他的一样执行就是了。即执行

connection.cursor()
cursor.execute(sql, [params])
cursor.fetchone() or cursor.fetchall()

下面是一个简单的例子。

from django.db import connection
def my_custom_sql(self):
    with connection.cursor() as cursor:
        cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz])
        cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz])
        row = cursor.fetchone()
    return row

如果你项目中有多个数据库的话,django.db.connection也能很方便的选取数据库。

django.db.connections 是一个类字典的结构,允许你使用数据库别名获取connection。

from django.db import connections
with connections['my_db_alias'].cursor() as cursor:
    # Your code here...

使用with作为上下文管理器:

with connection.cursor() as c:
    c.execute(...)

和下面这段代码等效

c = connection.cursor()
try:
    c.execute(...)
finally:
    c.close()

注意的问题:

如果你做了更新或者插入操作需要在代码中使用 :transaction.commit_unless_managed() 来提交数据。

或者使用事务装饰器(例如 commit_on_success)来修饰视图和提供事务控制数据提交。

这样就不用在代码中调用transaction.commit_unless_managed()。

但是,如果你不手动提交修改,你需要使用 transaction.set_dirty() 将事务标识为已脏。

使用 Django ORM 对数据库进行修改时,Django 会自动调用 set_dirty() 。

但如果你使用了原始 SQL ,Django 就无法获得你的 SQL 是否修改了数据。

只有手动调用 set_dirty() 才能确保 Django 知晓哪些修改必须被提交。

from django.db.transaction import commit_on_success
@commit_on_success
def my_custom_sql_view(request, value):
    from django.db import connection, transaction
    cursor = connection.cursor()
    # Data modifying operation
    cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [value])
    # Since we modified data, mark the transaction as dirty
    transaction.set_dirty()
    # Data retrieval operation. This doesn't dirty the transaction,
    # so no call to set_dirty() is required.
    cursor.execute("SELECT foo FROM bar WHERE baz = %s", [value])
    row = cursor.fetchone()
    #transaction.commit_unless_managed()
    return render_to_response('template.html', {'row': row})

如果不使用

参考文献:1、https://docs.djangoproject.com/en/2.0/topics/db/sql/

Django底层实现sql语句

在django中我们可以自己手写底层sql语句,那么如何写呢?

#导入原生sql模块
from django.db import connection
# 获取当前用户关注课程列表
def get_myflow(request):
    # 获取用户id
    uid = request.GET.get('id')
    # 建立游标对象
    cursor = connection.cursor()
    # 链表查询
    cursor.execute('select a.username,c.title from user a left join flows b on a.id=b.uid left join course c on b.cid=c.id where a.id = %s'% uid)
    # 获取结果集
    result = dictfetchall(cursor)
    print(result)
    # 返回结果
    return HttpResponse(json.dumps(result),content_type='application/json')

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python-re中search()函数的用法详解(查找ip)

    Python-re中search()函数的用法详解(查找ip)

    这篇文章主要介绍了Python-re中search()函数的用法-----查找ip,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Python实现在Excel文件中写入图表

    Python实现在Excel文件中写入图表

    这篇文章主要为大家介绍了如何利用Python语言实现在Excel文件中写入一个比较简单的图表,文中的实现方法讲解详细,快动手尝试一下吧
    2022-05-05
  • python 实现仿微信聊天时间格式化显示的代码

    python 实现仿微信聊天时间格式化显示的代码

    这篇文章主要介绍了python 实现仿微信聊天时间格式化显示,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-04-04
  • Python词云的正确实现方法实例

    Python词云的正确实现方法实例

    这篇文章主要给大家介绍了关于Python词云的正确实现方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • Python实战之手势识别控制电脑音量

    Python实战之手势识别控制电脑音量

    这篇文章主要为大家详细介绍了一个Python OpenCV的实战小项目——手势识别控制电脑音量,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-05-05
  • Pycharm-community-2021版安装和配置

    Pycharm-community-2021版安装和配置

    pycharm-community-PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,本文就来介绍一下Pycharm-community-2021版安装和配置,感兴趣的可以了解一下
    2023-11-11
  • 使用Pandas和Matplotlib进行数据清洗与可视化的实现步骤

    使用Pandas和Matplotlib进行数据清洗与可视化的实现步骤

    在数据科学领域,数据清洗和可视化是构建数据驱动解决方案的重要步骤,本文将详细介绍如何使用Pandas进行数据清洗,并结合Matplotlib进行可视化,文章通过实际代码示例讲解的非常详细,需要的朋友可以参考下
    2024-08-08
  • Python实现图像压缩和图像处理详解

    Python实现图像压缩和图像处理详解

    随着现在短视频类越来越火,随之而来的就是大量的视频图像的处理。这篇文章主要为大家介绍了Python如何一键实现图像压缩和图像处理,希望对你们有所帮助
    2022-07-07
  • Tensorflow 训练自己的数据集将数据直接导入到内存

    Tensorflow 训练自己的数据集将数据直接导入到内存

    这篇文章主要介绍了Tensorflow 训练自己的数据集将数据直接导入到内存,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • Pandas实现groupby分组统计方法实例

    Pandas实现groupby分组统计方法实例

    在数据处理的过程,有可能需要对一堆数据分组处理,例如对不同的列进行agg聚合操作(mean,min,max等等),下面这篇文章主要给大家介绍了关于Pandas实现groupby分组统计方法的相关资料,需要的朋友可以参考下
    2023-06-06

最新评论