📅  最后修改于: 2023-12-03 14:40:46.798000             🧑  作者: Mango
在 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 中的元组传递给查询方法。