📜  django 中的原始查询 - Python (1)

📅  最后修改于: 2023-12-03 14:40:46.798000             🧑  作者: Mango

Django 中的原始查询

在 Django 中,我们可以使用原始查询语句来执行高级查询。 原始查询语句即数据库查询语句,可以写入 Python 中,我们可在 Django 中使用 connections 模块来处理它们。

连接数据库

在执行原始查询之前,我们需要先连接到我们要查询的数据库。 Django的默认数据库是SQLite,但是如果你使用其他数据库,你需要在设置文件中指定相应的数据库信息。

import psycopg2
from django.db import connections

conn = connections['default']
database_name = conn.settings_dict['NAME']
user = conn.settings_dict['USER']
password = conn.settings_dict['PASSWORD']
host = conn.settings_dict['HOST']
port = conn.settings_dict['PORT']

conn_string = f"dbname='{database_name}' user='{user}' password='{password}' host='{host}' port='{port}'"
conn = psycopg2.connect(conn_string)
执行原始查询

在连接了数据库之后,我们可以使用 cursor 对象来执行查询。以下是使用原始查询的一个简单例子:

from django.db import connections

with connections['default'].cursor() as cursor:
    cursor.execute("SELECT * FROM myapp_mymodel")
    rows = cursor.fetchall()

# 输出结果
for row in rows:
    print(row)

在上述代码中,我们连接了默认数据库,并查询了我们的 myapp_mymodel 表的所有行。 然后我们使用 fetchall() 方法获取所有行。

参数化查询

原始查询的最大缺点是容易受到SQL注入攻击。 Python中的 psycopg2 库支持参数化查询,这在安全性方面是非常有用的。 在参数化查询中,我们可使用带有占位符的查询语句,然后使用一个元组将变量值传递给查询。下面是一个参数化查询的例子:

from django.db import connections

with connections['default'].cursor() as cursor:
    cursor.execute("SELECT * FROM myapp_mymodel WHERE id = %s", (1,))
    rows = cursor.fetchall()

# 输出结果
for row in rows:
    print(row)

在上述代码中,我们使用%s作为占位符来指定一个查询参数。然后我们将可变参数作为 Python 中的元组传递给查询方法。