• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    django执行原生SQL查询的实现

    执行原生 SQL 查询

    Django 允许你用两种方式执行原生 SQL 查询:

    1、执行原生查询

    管理器方法 raw() 能用于执行原生 SQL 查询,就会返回模型实例:

    Manager.raw(raw_query, params=None, translations=None)
    

    该方法接受一个原生 SQL 查询语句,执行它,并返回一个 django.db.models.query.RawQuerySet 实例。这个 RawQuerySet 能像普通的 QuerySet 一样被迭代获取对象实例。

    1.1 普通查询

    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 app_person'): # django默认的表名是app名加类名
        print(p)
    ​# 没有查询到就报错
    

    1.2 将查询字段映射为模型字段

    raw() 字段将查询语句中的字段映射至模型中的字段。
    查询语句中的字段排序并不重要。换而言之,以下两种查询是一致的:

    Person.objects.raw('SELECT id, first_name, last_name, birth_date FROM app_person')
    
    Person.objects.raw('SELECT last_name, birth_date, first_name, id FROM app_person')
    

    匹配是根据名字来的。这意味着你可以使用 SQL 的 AS 子句将查询语句中的字段映射至模型中的字段。所以,若你还有一些数据表包含了 Person 数据,你可以很方便的将其映射至 Person 实例:

    >>> Person.objects.raw('''SELECT first AS first_name,
    ...                              last AS last_name,
    ...                              bd AS birth_date,
    ...                              pk AS id,
    ...                       FROM app_person''')
    

    只要名字对上了,模型实例就会被正确创建。

    或者,你可以用 raw() 的 translations 参数将查询语句中的字段映射至模型中的字段。这是一个字典,将查询语句中的字段名映射至模型中的字段名。例如,上面的查询也能这样写:

    >>> name_map = {'first': 'first_name', 'last': 'last_name', 'bd': 'birth_date', 'pk': 'id'}
    >>> Person.objects.raw('SELECT * FROM some_other_table', translations=name_map)
    

    1.3 索引查询

    raw() 支持索引,所以,若你只需要第一个结果就这样写:

    >>> first_person = Person.objects.raw('SELECT * FROM app_person')[0]
    

    1.4 将参数传给 raw()

    如果你需要执行参数化的查询,可以使用 raw() 的 params 参数:

    >>> lname = 'Doe'
    >>> Person.objects.raw('SELECT * FROM myapp_person WHERE last_name = %s', [lname])
    

    params 是一个参数字典。你将用一个列表替换查询字符串中 %s 占位符,或用字典替换 %(key)s 占位符(其中, key 理所应当由字典 key 替换),不论你使用哪个数据库引擎。这些占位符会被 params 参数的值替换。
    !!!必须以列表形式传入参数,格式一定是这样写,不能写成字符串

    2、直接执行自定义 SQL

    绕过模型层。

    对象 django.db.connection 代表默认数据库连接。要使用这个数据库连接,调用 connection.cursor() 来获取一个指针对象。然后,调用 cursor.execute(sql, [params]) 来执行该 SQL 和 cursor.fetchone(),或 cursor.fetchall() 获取结果数据。

    from django.db import connection
    ​
    def my_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
    

    要避免 SQL 注入,你绝对不能在 SQL 字符串中用引号包裹 %s 占位符。
    注意,若要在查询中包含文本的百分号,你需要在传入参数使用两个百分号:

    cursor.execute("SELECT foo FROM bar WHERE baz = '30%%' AND id = %s", [self.id])
    

    2.1 指定连接数据库

    用 django.db.connections 获取指定数据库的连接(和指针)。 django.db.connections 是一个类字典对象,它允许你通过连接别名获取指定连接:

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

     到此这篇关于django执行原生SQL查询的实现的文章就介绍到这了,更多相关django执行原生SQL查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • django执行原始查询sql,并返回Dict字典例子
    • 在Django的模型中执行原始SQL查询的方法
    上一篇:pandas实现按照Series分组示例
    下一篇:Python脚本制作天气查询实例代码
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    django执行原生SQL查询的实现 django,执行,原生,SQL,查询,