簡體   English   中英

Django查詢過濾器,傳遞日期會導致無效的SQL語法

[英]Django query filter, passing a date results in an invalid SQL syntax

z = Pokes.objects.filter(
    pokestiming__when_start__lte=datetime.now(), 
    pokestiming__when_end__gte=datetime.now(),
    pokestiming__next_poke__lte=datetime.now(),
    poke_deleted=0,
    poke_operating=1,
)

這是我正在使用的查詢。 它選擇任何Poke對象,並在日期范圍內使用PokesTiming對象(外鍵)。 它基本上是一個開始日期和到期日。

問題是,傳遞datetime.now(),盡管它似乎是django文檔中完全相同的語法,但SQL結果是:

SELECT [字段名] FROM pokes INNER JOIN pokes_timing ON( pokesid = pokes_timingpoke_id )WHERE( pokespoke_deleted = 0 AND pokes_timingwhen_start <= 2010-02-01 00:00:00 AND pokes_timingnext_poke <= 2010- 02-01 13時50分48秒和pokes_timingwhen_end > = 2010-02-01 AND 13時50分48秒pokespoke_operating = 1)LIMIT 21

也就是說,傳遞的日期只是日期,不包含在字符串引號中,這會導致錯誤而沒有結果。 該查詢^ 由此方法檢索

我確定我錯過了一些愚蠢的話


楷模:

 class Pokes(models.Model): poke_title = models.CharField(max_length=135) poke_text = models.TextField() poke_email = models.CharField(max_length=450) poke_email_verified = models.IntegerField(null=True, blank=True) poke_key = models.CharField(max_length=30) poke_operating = models.IntegerField(default=0) poke_deleted = models.IntegerField(default=0) class Meta: db_table = u'pokes' def __unicode__(self): return self.poke_title class PokesTiming(models.Model): poke = models.ForeignKey(Pokes) interval_min = models.IntegerField(null=True, default=30) interval_max = models.IntegerField(null=True, default=120) when_start = models.DateTimeField() when_end = models.DateTimeField() last_run = models.DateTimeField() is_single = models.IntegerField(default=0) next_poke = models.DateTimeField() class Meta: db_table = u'pokes_timing' def __unicode__(self): return self.poke 

呸 - 一定是我。 它似乎現在通過Django工作(測試數據我一定是錯的 - 它現在返回一個結果)但原始SQL查詢不起作用。 我想Django在執行之前會做些什么嗎? 無論哪種方式,它似乎都在起作用。

此問題的錯誤報告已關閉為無效,因為Django沒有現有方法可以將實際查詢發送到數據庫。

#17612 - SQLite,filter,datefield,datetime在sql查詢中的日期周圍沒有引號

您可以看到此時此官方文檔中已提及此限制。

數據庫 - connection.queries中未引用的參數

有一個解決方案(來自https://code.djangoproject.com/ticket/17741 ):

import datetime
from django.db import connection
from myapp.models import Entry
today_entry_list = Entry.objects.filter(post_date=datetime.date.today())
sql, params = today_entry_list.query.sql_with_params()
cursor = connection.cursor()
cursor.execute('EXPLAIN ' + sql, params)
print(cursor.db.ops.last_executed_query(cursor, sql, params)[8:])

Django將始終將所有字段強制轉換為正確的SQL語法,當您手動執行時,可能不會這樣做。 因此你的錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM