在 Django 中执行 PostgreSql 查询
Execute PostgreSql query in django
我正在尝试在 Djnago 中执行 PostgreSQL 查询,但我遇到了一些问题。我想执行这个查询:
SELECT * FROM data_affectedproductversion
WHERE vendor_name LIKE 'cisco'
AND product_name LIKE 'adaptive%security%appliance%'
AND version='9.1(7)16'
如果我在 pgAdmin 查询编辑器中执行它,它可以工作,但是当我尝试使用 django 执行它时,它不起作用。我试过这样的事情:
results = AffectedProductVersion.objects.raw("SELECT * FROM data_affectedproductversion WHERE vendor_name LIKE 'cisco' AND product_name LIKE 'adaptive%security%appliance%software' AND version='9.1(7)16';")
for result in results:
print(result)
这是回溯
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "venv\lib\site-packages\django\db\models\query.py", line 1339, in __iter__
self._fetch_all()
File "venv\lib\site-packages\django\db\models\query.py", line 1326, in _fetch_all
self._result_cache = list(self.iterator())
File "venv\lib\site-packages\django\db\models\query.py", line 1349, in iterator
query = iter(self.query)
File "venv\lib\site-packages\django\db\models\sql\query.py", line 96, in __iter__
self._execute_query()
File "venv\lib\site-packages\django\db\models\sql\query.py", line 130, in _execute_query
self.cursor.execute(self.sql, params)
File "venv\lib\site-packages\django\db\backends\utils.py", line 100, in execute
return super().execute(sql, params)
File "venv\lib\site-packages\django\db\backends\utils.py", line 68, in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "venv\lib\site-packages\django\db\backends\utils.py", line 77, in _execute_with_wrappers
return executor(sql, params, many, context)
File "venv\lib\site-packages\django\db\backends\utils.py", line 85, in _execute
return self.cursor.execute(sql, params)
IndexError: tuple index out of range
知道我做错了什么以及如何将此 PostgreSQL 查询转换为 Django ORM 查询吗?
从 django.db 导入模型
来自 django.utils 导入时区
我的models.py:
class DataNist(models.Model):
description = models.TextField()
file =models.CharField(max_length=50)
date = models.DateTimeField(default=timezone.now)
severity = models.CharField(max_length=10)
exp_score = models.DecimalField(null=True, max_digits=5, decimal_places=1)
impact_score = models.DecimalField(null=True, max_digits=5, decimal_places=1)
cvss_score = models.DecimalField(null=True, max_digits=5, decimal_places=1)
published_date = models.IntegerField()
last_modified = models.IntegerField()
cve = models.CharField(max_length=30)
cve_url = models.CharField(max_length=1000)
def __str__(self):
return self.file
class Meta:
verbose_name_plural = 'Ranljivosti'
class AffectedProductVersion(models.Model):
data = models.ForeignKey(DataNist, on_delete=models.CASCADE)
vendor_name = models.CharField(max_length=100)
product_name = models.CharField(max_length=100)
version = models.CharField(max_length=150)
class Meta:
index_together = (
('vendor_name', 'product_name', 'version')
)
def __str__(self):
return self.vendor_name + '-' + self.product_name
您可以运行使用游标自定义SQL查询。
像这样
from django.db import connection
raw_query = "SELECT * FROM data_affectedproductversion
WHERE vendor_name LIKE 'cisco'
AND product_name LIKE 'adaptive%security%appliance%'
AND version='9.1(7)16'"
cursor = connection.cursor()
cursor.execute(raw_query)
cursor.fetchall()
有关详细信息,请参阅 docs
我不明白为什么您不能使用 Django ORM 来做到这一点。应该是这样的:
results = AffectedProductVersion.objects.filter(vendor_name__icontains='cisco', product_name__icontains='adaptive%security%appliance%', version__icontains='9.1(7)16')
或者您查找删除 __icontains
查找的确切值。
我正在尝试在 Djnago 中执行 PostgreSQL 查询,但我遇到了一些问题。我想执行这个查询:
SELECT * FROM data_affectedproductversion
WHERE vendor_name LIKE 'cisco'
AND product_name LIKE 'adaptive%security%appliance%'
AND version='9.1(7)16'
如果我在 pgAdmin 查询编辑器中执行它,它可以工作,但是当我尝试使用 django 执行它时,它不起作用。我试过这样的事情:
results = AffectedProductVersion.objects.raw("SELECT * FROM data_affectedproductversion WHERE vendor_name LIKE 'cisco' AND product_name LIKE 'adaptive%security%appliance%software' AND version='9.1(7)16';")
for result in results:
print(result)
这是回溯
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "venv\lib\site-packages\django\db\models\query.py", line 1339, in __iter__
self._fetch_all()
File "venv\lib\site-packages\django\db\models\query.py", line 1326, in _fetch_all
self._result_cache = list(self.iterator())
File "venv\lib\site-packages\django\db\models\query.py", line 1349, in iterator
query = iter(self.query)
File "venv\lib\site-packages\django\db\models\sql\query.py", line 96, in __iter__
self._execute_query()
File "venv\lib\site-packages\django\db\models\sql\query.py", line 130, in _execute_query
self.cursor.execute(self.sql, params)
File "venv\lib\site-packages\django\db\backends\utils.py", line 100, in execute
return super().execute(sql, params)
File "venv\lib\site-packages\django\db\backends\utils.py", line 68, in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "venv\lib\site-packages\django\db\backends\utils.py", line 77, in _execute_with_wrappers
return executor(sql, params, many, context)
File "venv\lib\site-packages\django\db\backends\utils.py", line 85, in _execute
return self.cursor.execute(sql, params)
IndexError: tuple index out of range
知道我做错了什么以及如何将此 PostgreSQL 查询转换为 Django ORM 查询吗?
从 django.db 导入模型 来自 django.utils 导入时区
我的models.py:
class DataNist(models.Model):
description = models.TextField()
file =models.CharField(max_length=50)
date = models.DateTimeField(default=timezone.now)
severity = models.CharField(max_length=10)
exp_score = models.DecimalField(null=True, max_digits=5, decimal_places=1)
impact_score = models.DecimalField(null=True, max_digits=5, decimal_places=1)
cvss_score = models.DecimalField(null=True, max_digits=5, decimal_places=1)
published_date = models.IntegerField()
last_modified = models.IntegerField()
cve = models.CharField(max_length=30)
cve_url = models.CharField(max_length=1000)
def __str__(self):
return self.file
class Meta:
verbose_name_plural = 'Ranljivosti'
class AffectedProductVersion(models.Model):
data = models.ForeignKey(DataNist, on_delete=models.CASCADE)
vendor_name = models.CharField(max_length=100)
product_name = models.CharField(max_length=100)
version = models.CharField(max_length=150)
class Meta:
index_together = (
('vendor_name', 'product_name', 'version')
)
def __str__(self):
return self.vendor_name + '-' + self.product_name
您可以运行使用游标自定义SQL查询。 像这样
from django.db import connection
raw_query = "SELECT * FROM data_affectedproductversion
WHERE vendor_name LIKE 'cisco'
AND product_name LIKE 'adaptive%security%appliance%'
AND version='9.1(7)16'"
cursor = connection.cursor()
cursor.execute(raw_query)
cursor.fetchall()
有关详细信息,请参阅 docs
我不明白为什么您不能使用 Django ORM 来做到这一点。应该是这样的:
results = AffectedProductVersion.objects.filter(vendor_name__icontains='cisco', product_name__icontains='adaptive%security%appliance%', version__icontains='9.1(7)16')
或者您查找删除 __icontains
查找的确切值。