django - Django:shell plus --print-sql 如果查询很长,则显示不完整的 sql
问题描述
我正在使用 Django 2.0。
我有以下型号:
class SingleMeasurements (models.Model):
MASS = 'kg'
VOLUME = 'ltr'
PIECES = 'pcs'
MUNITS_CHOICES = (
(VOLUME, 'Liter'),
(MASS, 'Kilogram'),
(PIECES, 'Pieces'),
)
name = models.CharField(max_length=200,unique=True,null=False)
slug = models.SlugField(unique=True)
formtype = models.CharField(max_length=10,choices=MUNITS_CHOICES,verbose_name="Units")
quantity = models.DecimalField(max_digits=19, decimal_places=10)
updated = models.DateTimeField(auto_now=True, auto_now_add=False)
timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)
class Recipe(models.Model):
MASS = 'kg'
VOLUME = 'ltr'
PIECES = 'pcs'
MUNITS_CHOICES = (
(MASS, 'Mass'),
(VOLUME, 'Volume'),
(PIECES, 'Pieces'),
)
name = models.CharField(max_length=200)
slug = models.SlugField(unique=True)
tags = models.ManyToManyField(Tag,related_name='recipes_recipe_tag',blank=True)
primary_unit = models.CharField(max_length=10,choices=MUNITS_CHOICES,default=VOLUME,verbose_name="Preferred Display Units",null=True,blank=True)
mass_unit = models.ForeignKey(SingleMeasurements,on_delete=models.PROTECT,related_name='recipe_singlemeasurement_mass_unit',blank=True,null=True)
mass_quantity = models.DecimalField(max_digits=19, decimal_places=10,null=True,blank=True)
volume_unit = models.ForeignKey(SingleMeasurements,on_delete=models.PROTECT,related_name='recipe_singlemeasurement_volume_unit',blank=True,null=True)
volume_quantity = models.DecimalField(max_digits=19, decimal_places=10,null=True,blank=True)
pieces_unit = models.ForeignKey(SingleMeasurements,on_delete=models.PROTECT,related_name='recipe_singlemeasurement_pieces_unit',blank=True,null=True)
pieces_quantity = models.DecimalField(max_digits=19, decimal_places=10,null=True,blank=True)
updated = models.DateTimeField(auto_now=True, auto_now_add=False)
timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)
我通过以下命令打开了 Django shell:
python manage.py shell_plus --print-sql --ipython
我正在尝试运行以下命令
Recipe.objects.select_related('mass_unit','volume_unit','pieces_unit').all()
输出是:
In [19]: Recipe.objects.select_related('mass_unit','volume_unit','pieces_unit').all()
Out[19]: SELECT "recipes_recipe"."id",
"recipes_recipe"."name",
"recipes_recipe"."slug",
"recipes_recipe"."primary_unit",
"recipes_recipe"."mass_unit_id",
"recipes_recipe"."mass_quantity",
"recipes_recipe"."volume_unit_id",
"recipes_recipe"."volume_quantity",
"recipes_recipe"."pieces_unit_id",
"recipes_recipe"."pieces_quantity",
"recipes_recipe"."updated",
"recipes_recipe"."timestamp",
"single_measurements_singlemeasurements"."id",
"single_measurements_singlemeasurements"."name",
"single_measurements_singlemeasurements"."slug",
"single_measurements_singlemeasurements"."formtype",
"single_measurements_singlemeasurements"."quantity",
"single_measurements_singlemeasurements"."updated",
"single_measurements_singlemeasurements"."timestamp",
T3."id",
T3."name",
T3."slug",
T3."formtype",
T3."quantity",
T3."updated",
T3."timestamp",
T4."id",
T4."name",
T4."slug",
T4."formtype",
T4."quantity",
T4."updated",
T4."timestamp"
FROM "recipes_recipe"
LEFT OUTER JOIN "single_measurements_singlemeasurements"
ON
Execution time: 0.001236s [Database: default]
我们可以看到 sql 是不完整的,它必须显示三个左内连接,但它在 ON 处停止。
而如果我尝试:
Recipe.objects.select_related('mass_unit').all()
它显示了完整的 sql:
In [20]: Recipe.objects.select_related('mass_unit').all()
Out[20]: SELECT "recipes_recipe"."id",
"recipes_recipe"."name",
"recipes_recipe"."slug",
"recipes_recipe"."primary_unit",
"recipes_recipe"."mass_unit_id",
"recipes_recipe"."mass_quantity",
"recipes_recipe"."volume_unit_id",
"recipes_recipe"."volume_quantity",
"recipes_recipe"."pieces_unit_id",
"recipes_recipe"."pieces_quantity",
"recipes_recipe"."updated",
"recipes_recipe"."timestamp",
"single_measurements_singlemeasurements"."id",
"single_measurements_singlemeasurements"."name",
"single_measurements_singlemeasurements"."slug",
"single_measurements_singlemeasurements"."formtype",
"single_measurements_singlemeasurements"."quantity",
"single_measurements_singlemeasurements"."updated",
"single_measurements_singlemeasurements"."timestamp"
FROM "recipes_recipe"
LEFT OUTER JOIN "single_measurements_singlemeasurements"
ON ("recipes_recipe"."mass_unit_id" = "single_measurements_singlemeasurements"."id")
ORDER BY "recipes_recipe"."name" ASC
LIMIT 21
在这里,它不会停在 ON 上。它显示了完整的。
如何确保 --print-sql 显示完整的 sql。
解决方案
将这些添加到您的settings.py
:
for python manage.py shell_plus --print-sql
:
SHELL_PLUS_PRINT_SQL_TRUNCATE = {truncate limit}
(默认为 1000)
for python manage.py runserver_plus --print-sql
:
RUNSERVER_PLUS_PRINT_SQL_TRUNCATE = {truncate limit}
(默认为 1000)
请注意,截断限制是要截断 sql 输出的字符数,而不是行数。
推荐阅读
- c# - 由于病毒扫描程序导致 WCF 通信缓慢
- flutter - 在颤振中使用 URL 启动器发送电子邮件的问题
- reactjs - React 中的 DOM 节点是否有对应的 Angular“插槽”?
- android - 使用teamCity构建到s3后上传ipa和apk
- java - 执行的后台和前台服务
- angular - 如何在 Angular 2 中添加使用 razor index.cshtml insted 静态文件的自定义 UseSpa?
- python - 如何创建具有函数特殊(dunder)属性的 Mock
- python - 从 numpy.random.multinomial 获取随机的索引数组
- python - 如何选择具有特定值的列迭代数据框中的所有行?
- python - 如何构建thundersvm?