Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este artigo explica como executar consultas SQL brutas em SQL Server de aplicativos Django. O SQL bruto é útil para operações não expostas por meio do ORM do Django, como Transact-SQL complexas (T-SQL), consultas espaciais ou operações críticas ao desempenho.
Use connection.cursor()
Acesse o cursor de banco de dados diretamente por meio do objeto do connection Django:
from django.db import connection
def get_server_version():
with connection.cursor() as cursor:
cursor.execute("SELECT @@VERSION;")
row = cursor.fetchone()
return row[0]
A with instrução garante que o cursor esteja devidamente fechado após o uso.
Consultas parametrizadas
Sempre use consultas parametrizadas para evitar a injeção de SQL. Passe parâmetros como uma lista:
Note
Os exemplos a seguir usam a convenção <app_label>_<model_name> de nomenclatura de tabela padrão do Django (por exemplo, myapp_product). Se você sobrescrever db_table no Meta de um modelo, use esse nome. Você também pode ler o nome resolvido em tempo de execução com Product._meta.db_table.
from django.db import connection
def get_products_by_price(min_price, max_price):
with connection.cursor() as cursor:
cursor.execute(
"SELECT id, name, price FROM myapp_product WHERE price BETWEEN %s AND %s;",
[min_price, max_price],
)
results = cursor.fetchall()
return results
Importante
Nunca use formatação de cadeia de caracteres ou cadeias de caracteres f para inserir valores em consultas SQL. Sempre use consultas parametrizadas (%s espaços reservados com uma lista de parâmetros) para evitar a injeção de SQL.
Buscar resultados
O cursor do Django fornece vários métodos para recuperar resultados:
from django.db import connection
def demonstrate_fetch_methods():
with connection.cursor() as cursor:
cursor.execute("SELECT id, name FROM myapp_product;")
# Fetch one row
row = cursor.fetchone()
# Fetch the next 10 rows (continues from where fetchone stopped)
rows = cursor.fetchmany(10)
# Fetch all remaining rows (continues from where fetchmany stopped)
all_rows = cursor.fetchall()
Retornar resultados como dicionários
Converter linhas em dicionários usando cursor.description:
from django.db import connection
def dictfetchall(cursor):
columns = [col[0] for col in cursor.description]
return [dict(zip(columns, row)) for row in cursor.fetchall()]
def get_all_products():
with connection.cursor() as cursor:
cursor.execute("SELECT id, name, price FROM myapp_product;")
return dictfetchall(cursor)
Usar Manager.raw() para consultas de modelo
Quando você quiser SQL bruto, mas ainda quiser instâncias de modelo do Django, use Manager.raw():
from myapp.models import Product
products = Product.objects.raw(
"SELECT id, name, price FROM myapp_product WHERE price > %s",
[10.00],
)
for product in products:
print(f"{product.name}: ${product.price}")
A consulta deve retornar todos os campos definidos na chave primária do modelo. Campos adicionais são carregados de forma preguiçosa.
Executar instruções DDL
Use o SQL bruto para operações de esquema que o Django não dá suporte diretamente:
from django.db import connection
def create_index():
with connection.cursor() as cursor:
cursor.execute(
"CREATE INDEX IX_product_name ON myapp_product (name) "
"INCLUDE (price);"
)
Várias conexões de banco de dados
Se você usar vários bancos de dados, especifique qual conexão usar:
from django.db import connections
def query_reporting_db():
with connections["reporting"].cursor() as cursor:
cursor.execute("SELECT COUNT(*) FROM myapp_product;")
return cursor.fetchone()[0]