2017-03-21 48 views
0

我有一個模型和定製經理Django的數據庫MySQL的原執行

模型

class VideoDescription(models.Model): 
    title_eng = models.CharField(max_length=120, unique=True) 
    title_ru = models.CharField(max_length=120, unique=True) 
    slug = models.SlugField(max_length=200, unique=True, blank=True) 
    rating = models.IntegerField(default=0) 
    pub_date_start = models.DateField() 
    poster = models.ImageField(upload_to=get_poster_path) 
    genre = models.CharField(validators=[validate_comma_separated_integer_list], max_length=10, default=0) 
    description = models.TextField(blank=True) 

objects = VideoDescriptionManager() 

class VideoDescriptionManager(models.Manager): 
def get_video_by_genre(self, genre): 
    from django.db import connection 
    with connection.cursor() as cursor: 
     cursor.execute('''select m.id, m.title_eng, m.title_ru, m.slug, m.rating, m.pub_date_start, 
     m.poster, m.genre, m.description, COUNT(*) from main_app_videodescription m 
         where genre like "%%%s%%";''', [genre]) 
     result_list = [] 
     for row in cursor.fetchall(): 
      p = self.model(id=row[0], title_eng=row[1], title_ru=row[2], slug=row[3], rating=row[4], 
          pub_date_start=row[5], poster=row[6], genre=row[7], description=row[8]) 
      p.num_responses = row[9] 
      result_list.append(p) 
     return result_list 

,我已經得到了一個錯誤:

django.db.utils.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 0, and there are 1 supplied. 

谷歌說着我改變[風格]以(流派,)在一個原始的SQL查詢,但它沒有幫助。 我能做些什麼來解決它?

+1

你爲什麼在這裏使用raw sql?您可以使用['contains'](https://docs.djangoproject.com/en/1.11/ref/models/querysets/#std:fieldlookup-contains)作爲'genre'上的過濾器。我不明白爲什麼當你沒有連接或groupby時有'COUNT(*)'。 – Alasdair

+0

@Alasdair因爲我不知道'contains'。非常感謝你。 –

回答

1

sqlite不使用%s作爲參數,它使用?

但是無論使用sqlite還是其他數據庫,都不能使用參數替換在字符串中插入參數。您需要分別建立字符串,然後使用參數插入它。所以:

param = "%{}%".format(genre) 
cursor.execute('''select m.id, m.title_eng, m.title_ru, m.slug, m.rating, m.pub_date_start, 
        m.poster, m.genre, m.description, COUNT(*) from main_app_videodescription m 
         where genre like ?;''', [param]) 

請注意,使用.format消除了雙重轉義百分比的需要。

+0

這是一個Django遊標 - 我以爲它使用'%s'作爲佔位符,即使你使用的是sqlite。 – Alasdair

+0

現在我有一個錯誤'TypeError:不是在字符串格式化過程中轉換的所有參數' –