Ошибка Django только в базе данных MySQL

#mysql #django #django-templates #django-views #mysql-error-1242

#mysql #django #django-шаблоны #django-просмотры #mysql-ошибка-1242

Вопрос:

Локально я использую sqllite3 в качестве базы данных, но в рабочей среде я использую MySQL. Когда я перенес свой проект в производство, я столкнулся с этой ошибкой:

   ...
File "S:Python27libsite-packagesdjangotemplatetagsi18n.py", line 46, in
render
    langs = self.languages.resolve(context)
  File "S:Python27libsite-packagesdjangotemplatebase.py", line 653, in res
olve
    value = self._resolve_lookup(context)
  File "S:Python27libsite-packagesdjangotemplatebase.py", line 692, in _re
solve_lookup
    raise VariableDoesNotExist("Failed lookup for key [%s] in %r", (bit, current
)) # missing attribute
VariableDoesNotExist: Failed lookup for key [LANGUAGES] in u'[{}, {}, {}]'
  

Я использую i18n от django

Есть идеи о том, откуда это берется? Google мало что сообщил, также какие данные было бы полезно просмотреть для отладки? Я указал свою локальную тестовую среду на рабочую базу данных и получил ту же ошибку.

Мои ЯЗЫКИ варьируются в settings.py является:

 LANGUAGES = (
    ('en',gettext('English')),
    ('fr',gettext('French')),
)
  

Редактировать
При включенной отладке я получаю сообщение об ошибке:

 Caught OperationalError while rendering: (1242, 'Subquery returns more than 1 row')
  

в строке {% for f in frames %}

Моя модель фрейма:

 @I18n('title','description')
class Collection(models.Model):
    title = models.CharField(max_length=255)
    description = models.CharField(max_length=255)
    order = models.IntegerField(default=100)
    image = models.ImageField(upload_to="collection/images",null=True)
    rollover = models.ImageField(upload_to="collection/images",null=True,blank=True)
    publish = models.BooleanField(default=True)

    def __unicode__(self):
        return self.title

@I18n('title')
class Frame(models.Model):
    title = models.CharField(max_length=255)
    collection = models.ManyToManyField(Collection)
    order = models.IntegerField(default=100)
    image = models.ImageField(upload_to="frame/images")
    rollover = models.ImageField(upload_to="frame/images",null=True,blank=True)
    publish = models.BooleanField(default=True)

    def __unicode__(self):
        return self.title
  

ПРАВКА # 2

Проблемные строки MySQL, которые не выходят из строя в SQLite

 SELECT `FrontEnd_article`.`id`, `FrontEnd_article`.`title_fr`, `FrontEnd_article`
.`title_en`, `FrontEnd_article`.`text_fr`, `FrontEnd_article`.`text_en`, 
`FrontEnd_article`.`date`, `FrontEnd_article`.`image`, `FrontEnd_article`.`image_text`, 
`FrontEnd_article`.`can_comment`, `FrontEnd_article`.`order`, 
`FrontEnd_article`.`publish` FROM `FrontEnd_article` INNER JOIN 
`FrontEnd_article_frames` ON (`FrontEnd_article`.`id` = 
`FrontEnd_article_frames`.`article_id`) WHERE `FrontEnd_article_frames`.`frame_id` =  
(SELECT U0.`id` FROM `FrontEnd_frame` U0 INNER JOIN `FrontEnd_frame_collection` U1 ON 
(U0.`id` = U1.`frame_id`) WHERE (U1.`collection_id` = 1  AND U0.`publish` = True )) 
ORDER BY `FrontEnd_article`.`date` DESC
  

Еще раз спасибо за помощь!

Ответ №1:

Будет ли обратная трассировка такой же, если вы временно включите DEBUG? Сообщения об ошибках могут вводить в заблуждение, когда она отключена. Это также может быть неправильной настройкой базы данных, и Django завершает работу на другом этапе.

Комментарии:

1. Вау, спасибо за этот совет! Я предполагаю, что я частично преследовал отвлекающий маневр. Сейчас я получаю эту ошибку… Обнаружена OperationalError во время рендеринга: (1242, ‘Подзапрос возвращает более 1 строки’)

2. Как выглядит запрос к БД, который вызывает ошибку? Использует ли он orm или это необработанный sql? Очевидно, что запрос содержит sql, который допустим в sqlite, но не в mysql, и, таким образом, возникает OperationalError.

Ответ №2:

 SELECT * FROM FrontEnd_article INNER JOIN FrontEnd_article_frames ON 
(FrontEnd_article.id = FrontEnd_article_frames.article_id) WHERE 
FrontEnd_article_frames.frame_id = (SELECT U0.id FROM FrontEnd_frame U0 INNER JOIN 
FrontEnd_frame_collection U1 ON (U0.id = U1.frame_id) WHERE (U1.collection_id = 1  AND 
U0.publish = True ))
  

Это упрощенная версия того, что генерируется Django. Когда я разбил этот запрос, я понял, что inner join предполагает, что возвращается только 1 значение из:

 (SELECT U0.id FROM FrontEnd_frame U0 INNER JOIN FrontEnd_frame_collection U1 ON 
(U0.id = U1.frame_id) WHERE (U1.collection_id = 1  AND U0.publish = True ))
  

Который фактически вернул результирующий набор данных. Исправление было простым, как только я нашел его, я заменил «=» на «IN», и оно сработало правильно.

 FrontEnd_article_frames.frame_id IN (SELECT U0.id FROM FrontEnd_frame U0 INNER JOIN
FrontEnd_frame_collection U1 ON (U0.id = U1.frame_id) WHERE (U1.collection_id = 1  AND 
U0.publish = True ))