Manipular consultas sin procesar en Django

Salman Mehmood 15 febrero 2024
Manipular consultas sin procesar en Django

Aprenderemos, con esta explicación, sobre qué hace el método raw() y cómo podemos manipular consultas sin formato, y también aprenderemos cómo inyectar SQL dentro de nuestras aplicaciones en Django.

Manipular consultas sin formato con la ayuda del método raw() en Django

Usar el método raw() en Django nos permite tomar o construir consultas SQL y ejecutarlas. Pero esta no es la única forma de ejecutar consultas SQL en Django; en lugar de utilizar la configuración de formulario predeterminada, también podemos, si queremos, omitir el formulario y simplemente ejecutar consultas SQL.

Pero, ¿por qué mencionamos eso? Porque el método raw() del administrador de modelos generalmente debería ser su primera opción cuando desea ejecutar consultas SQL sin formato.

Esto se debe a que la estructura de la instancia de clase de conjunto de consultas sin procesar es muy similar a lo que ha estado trabajando con la instancia de clase de conjunto de consultas. Podemos realizar otras acciones en las consultas sin formato, como la indexación y el corte.

Entonces, comencemos con un ejemplo realmente simple. Avancemos y creemos la nueva función llamada STUDENT_DATA().

Usaremos el conjunto de datos simple y el modelo Student en nuestro archivo models.py.

class Student(models.Model):

    FIRST_NAME = models.CharField(max_length=100)
    SR_NAME = models.CharField(max_length=100)
    age = models.IntegerField()
    CLASS_ROOM = models.IntegerField()
    TEACHER = models.CharField(max_length=100)

    def __str__(self):
        return self.FIRST_NAME

Ahora volveremos al archivo views.py y crearemos una función llamada STUDENT_DATA() para demostrar el SQL sin formato.

Dentro de la función, tomaremos todos los datos de la tabla Student usando Student.objects.all(). Esto devolverá todos los datos de los estudiantes de esta tabla y los almacenará en SD_DATA.

Imprimamos este objeto. También utilizaremos connection.queries que darán la salida de SQL y algunas medidas de rendimiento.

def STUDENT_DATA(request):

    SD_DATA = Student.objects.all()

    print(SD_DATA)
    print(connection.queries)
    return render(request, "output.html", {"data": SD_DATA})

Sigamos adelante y ejecutemos el servidor. El navegador mostrará todos los datos y, a continuación, podemos ver que obtuvimos la consulta SQL que ejecutamos.

Django Salida SQL sin procesar 1

Avancemos y creemos un equivalente usando el método raw(). Entonces, nuevamente usaremos student y sus objetos, pero esta vez usaremos raw().

Tendremos que ejecutar la consulta SQL dentro de este método: SELECT * FROM student_student.

No necesitamos seleccionar todos estos elementos individuales, por lo que podemos usar la estrella para seleccionar todos los campos de la tabla, y luego la siguiente cláusula es FROM, que ayuda a encontrar la tabla. Luego definiremos el nombre de la tabla que se llama estudiante_estudiante.

SD_DATA = Student.objects.raw("SELECT * FROM student_student")

Volvamos al navegador y actualicemos. Luego veremos que estamos devolviendo estos elementos de la base de datos usando una declaración Select.

Django Salida SQL sin procesar 2

Ahora avanzaremos y expandiremos esto ligeramente y seleccionaremos un elemento individual. Para hacer esto, necesitaremos usar la cláusula WHERE; después de un espacio, seleccionamos el atributo edad y lo pasamos como un valor de 21.

SD_DATA = Student.objects.raw("SELECT * FROM student_student WHERE age=21")

Volvamos a ejecutar el servidor Django y actualicemos el navegador. Luego veremos que el SQL está funcionando y devuelve un solo elemento de la base de datos.

Django Salida SQL sin procesar 3

Hemos visto cómo inyectar nuestro SQL en la función raw() de Django y cómo podemos realizar acciones sobre la base de datos.

En la documentación de Django, si revisa la referencia instantánea del modelo y la lee, le dará información sobre un modelo diferido. El término instancias de modelos diferidos se refiere a los campos emitidos desde la consulta hasta que los cargamos a pedido.

Para imprimir los datos, debemos especificar qué datos queremos ver en la salida, por lo que para hacerlo, necesitaremos usar un bucle for.

for d in Student.objects.raw("SELECT * FROM student_student"):
    print(d)

Si volvemos a ejecutar esto, busque en la consola porque estamos imprimiendo esto y devolviendo los tres nombres de la tabla.

Django Salida SQL sin procesar 4

Puede encontrar consultas más complejas aquí. Por ejemplo, un concepto llamado hacer un conjunto de consultas significa que podemos limitar la cantidad de objetos que queremos devolver.

Ahora declararemos una nueva variable llamada sql, luego almacenaremos la consulta SQL en ella y la pasaremos dentro de la función raw(). Después de la función raw(), limitaremos dos filas cortando los objetos.

sql = "SELECT * FROM student_student"
SD_DATA = Student.objects.raw(sql)[:2]

Cuando echamos un vistazo a la salida, solo devuelve las dos filas.

Django Salida SQL sin procesar 5

Código Fuente Completo del Archivo views.py:

from django.shortcuts import render
from .models import Student
from django.db import connection


def STUDENT_DATA(request):

    SD_DATA = Student.objects.all()
    sql = "SELECT * FROM student_student"
    SD_DATA = Student.objects.raw(sql)[:2]
    # for d in Student.objects.raw('SELECT * FROM student_student'):
    #     print(d)

    print(SD_DATA)
    # print(connection.queries)
    return render(request, "output.html", {"data": SD_DATA})

Usamos el siguiente código dentro de nuestra plantilla.

{{data}}

<hr/>

{% for i in data %}
    <div>{{ i.FIRST_NAME }} - {{ i.age }}</div>
{% endfor %}
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn

Artículo relacionado - Django SQL