• 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)
    
  • 相关阅读:
    pip install 下载慢的问题
    virtualenv 和 virtualenvwrapper 实践
    一个采用python获取股票数据的开源库,相当全,及一些量化投资策略库
    qos
    Rxjava, RxAndroid, Retrofit 等库的使用
    一个程序员直播的地方
    Android Studio 中SDK Manager的设置
    ipython, 一个 python 的交互式 shell,比默认的python shell 好用得多,支持变量自动补全,自动缩进,支持 bash shell 命令,内置了许多很有用的功能和函数
    Nagle算法,tcp小包组合(延迟)发送的算法
    RESTful到底是什么玩意??
  • 原文地址:https://www.cnblogs.com/robertx/p/10506310.html
Copyright © 2020-2023  润新知