@Alexey_Kutepov
Разработчик программного обеспечения

Почему данные не сохраняются в БД MySQL?

Добрый день всем!

У меня такая проблема:

Есть модель
class Test(models.Model):
    """
    The model of the test
    """

    # The name of the test
    name = models.CharField(max_length=500)
    # The description of test
    description = models.TextField(blank=True)
    # The test
    test = models.BinaryField(blank=True)
    # The author of the test
    author = models.ForeignKey(settings.AUTH_USER_MODEL)
    # The category of the test
    category = models.ForeignKey(Category)
    # date and time of create test
    date_and_time = models.DateTimeField(default=timezone.now())
    # How many users complete this test.
    rating = models.IntegerField(default=0)
    # Public or not public test
    is_public = models.BooleanField(default=True)

    def __str__(self):
        return self.name


При попытки создаю класс Test, заполняю его, и сохнаняю. В результате получаю ошибку:
Exception Type: UnicodeDecodeError
Exception Value: 'utf-8' codec can't decode byte 0x80 in position 74: invalid start byte

Стектрейс:
(django17)11:45 ~/exam_project (master)$ python3 populate_exam.py                                                                                                                                                
Starting Exam population script...
Traceback (most recent call last):
  File "populate_exam.py", line 214, in <module>
    populate()
  File "populate_exam.py", line 40, in populate
    category1
  File "populate_exam.py", line 208, in add_test
    )[0]
  File "/home/alkutepov/.virtualenvs/django17/lib/python3.4/site-packages/django/db/models/manager.py", line 92, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/alkutepov/.virtualenvs/django17/lib/python3.4/site-packages/django/db/models/query.py", line 422, in get_or_create
    return self.get(**lookup), False
  File "/home/alkutepov/.virtualenvs/django17/lib/python3.4/site-packages/django/db/models/query.py", line 351, in get
    num = len(clone)
  File "/home/alkutepov/.virtualenvs/django17/lib/python3.4/site-packages/django/db/models/query.py", line 122, in __len__
    self._fetch_all()
  File "/home/alkutepov/.virtualenvs/django17/lib/python3.4/site-packages/django/db/models/query.py", line 966, in _fetch_all
    self._result_cache = list(self.iterator())
  File "/home/alkutepov/.virtualenvs/django17/lib/python3.4/site-packages/django/db/models/query.py", line 265, in iterator
    for row in compiler.results_iter():
  File "/home/alkutepov/.virtualenvs/django17/lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 700, in results_iter
    for rows in self.execute_sql(MULTI):
  File "/home/alkutepov/.virtualenvs/django17/lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 786, in execute_sql
    cursor.execute(sql, params)
  File "/home/alkutepov/.virtualenvs/django17/lib/python3.4/site-packages/django/db/backends/utils.py", line 85, in execute
    sql = self.db.ops.last_executed_query(self.cursor, sql, params)
  File "/home/alkutepov/.virtualenvs/django17/lib/python3.4/site-packages/mysql/connector/django/base.py", line 377, in last_executed_query
    return cursor.statement
  File "/home/alkutepov/.virtualenvs/django17/lib/python3.4/site-packages/mysql/connector/django/base.py", line 153, in __getattr__
    return getattr(self.cursor, attr)
  File "/home/alkutepov/.virtualenvs/django17/lib/python3.4/site-packages/mysql/connector/cursor.py", line 858, in statement
    return self._executed.strip().decode('utf8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 265: invalid start byte
(django17)11:45 ~/exam_project (master)$


Ошибка моделируется только в MySql, в sqlite всё отлично работает.
Использую Django 1.7.7 и python3.4

Подозреваю что не может записать данные в поле типа BinaryField

Кто сталкивался с подобной проблемой? Как исправить?
  • Вопрос задан
  • 2180 просмотров
Решения вопроса 2
@marazmiki
Укротитель питонов
Поди, таблица в mysql создана в LATIN1?
Ответ написан
@Alexey_Kutepov Автор вопроса
Разработчик программного обеспечения
Проблему удалось решить поменяв драйвер на https://pypi.python.org/pypi/mysqlclient
и в настройки "OPTIONS": { "init_command": "SET names utf8; " }
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
skipirich
@skipirich
проходил мимо
Если есть доступ к консоле или к какой нить штуке для управления базами типа phpmyadmin то попробуй выполнить вот такие команды
ALTER ИМЯ_ТВОЕЙ_БД `database_utf8` CHARACTER SET 'utf8';
ALTER ИМЯ_ТВОЕЙ_БД `database_utf8` COLLATE 'utf8_general_ci';


После этого надо конвертнуть таблицы
SELECT CONCAT(  'ALTER TABLE `', t.`TABLE_SCHEMA` ,  '`.`', t.`TABLE_NAME` ,  '` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) AS sqlcode
FROM  `information_schema`.`TABLES` t
WHERE 1
AND t.`TABLE_SCHEMA` =  'ИМЯ_ТВОЕЙ_БД'
ORDER BY 1
LIMIT 0 , 90
Ответ написан
Комментировать
Splo1ter
@Splo1ter
.NET Developer (9 years+)
Потому что лучше использовать PostgreSQL, MySQL давно отжила свое, ее выбирают если незнают как работает PostgreSQL, PostgreSQL это практически MS SQL просто бесплатно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы