zoukankan      html  css  js  c++  java
  • django系列5.4--ORM中执行原生SQL语句, Python脚本中调用django环境

    ORM执行原生sql语句

    在模型查询API不够用的情况下,我们还可以使用原始的SQL语句进行查询。

    Django 提供两种方法使用原始SQL进行查询:一种是使用raw()方法,进行原始SQL查询并返回模型实例;另一种是完全避开模型层,直接执行自定义的SQL语句。

    执行原生查询

    raw()管理器方法用于原始的SQL查询,并返回模型的实例:

    注意:raw()语法查询必须包含主键。

    这个方法执行原始的SQL查询,并返回一个django.db.models.query.RawQuerySet 实例。 这个RawQuerySet 实例可以像一般的QuerySet那样,通过迭代来提供对象实例。

    举个例子:

    class Person(models.Model):
        first_name = models.CharField(...)
        last_name = models.CharField(...)
        birth_date = models.DateField(...)
    

    可以像下面这样执行原生SQL语句

    >>> for p in Person.objects.raw('SELECT * FROM myapp_person'):
    ...     print(p)
    

    raw()查询可以查询其他表的数据。

    举个例子:

    ret = models.Student.objects.raw('select id, tname as hehe from app02_teacher')
        for i in ret:
            print(i.id, i.hehe)
    

    raw()方法自动将查询字段映射到模型字段。还可以通过translations参数指定一个把查询的字段名和ORM对象实例的字段名互相对应的字典

    d = {'tname': 'haha'}
        ret = models.Student.objects.raw('select * from app02_teacher', translations=d)
        for i in ret:
            print(i.id, i.sname, i.haha)
    

    原生SQL还可以使用参数,注意不要自己使用字符串格式化拼接SQL语句,防止SQL注入!

    d = {'tname': 'haha'}
        ret = models.Student.objects.raw('select * from app02_teacher where id > %s', translations=d, params=[1,])
        for i in ret:
            print(i.id, i.sname, i.haha)
    

    ###直接执行自定义SQL

    有时候raw()方法并不十分好用,很多情况下我们不需要将查询结果映射成模型,或者我们需要执行DELETE、 INSERT以及UPDATE操作。在这些情况下,我们可以直接访问数据库,完全避开模型层。

    我们可以直接从django提供的接口中获取数据库连接,然后像使用pymysql模块一样操作数据库。

    from django.db import connection, connections
    cursor = connection.cursor()  # cursor = connections['default'].cursor()
    cursor.execute("""SELECT * from auth_user where id = %s""", [1])
    ret = cursor.fetchone()
    

    Python脚本中调用Django环境(django外部脚本使用models)

    如果你想通过自己创建的python文件在django项目中使用django的models,那么就需要调用django的环境:

    import os
    
    if __name__ == '__main__':
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BMS.settings")
        import django
        django.setup()
    
        from app01 import models  #引入也要写在上面三句之后
    
        books = models.Book.objects.all()
        print(books)
    
  • 相关阅读:
    win7下配置JAVA环境变量
    使用PLSQL Developer和DbVisualizer、SQLDBx查询oracle数据库时出现乱码
    PL/SQL连接ORACLE失败,ORA-12154: TNS: could not resolve the connect identifier specified
    分布式计算开源框架Hadoop入门实践(三)
    分布式计算开源框架Hadoop入门实践(二)
    js使用WebSocket,java使用WebSocket
    springboot管理类,springboot注入类
    博客园点击弹出桃心的js样式、自动落雪花 、复制放进去即可实现
    jquery提交表单 提交form表单
    vue下拉列表
  • 原文地址:https://www.cnblogs.com/robertx/p/10506310.html
Copyright © 2011-2022 走看看