#30887 closed Bug (duplicate)
UnicodeEncodeError logging error with saving binary with PyMySQL driver.
Reported by: | Louis | Owned by: | nobody |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | 2.1 |
Severity: | Normal | Keywords: | |
Cc: | Triage Stage: | Unreviewed | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
from django.db import models class JobContext(models.Model): data = models.BinaryField() class Meta: verbose_name = 'JobContext' JobContext.objects.create(data=b'\x80\x03X\x04\x00\x00\x00xxxxq\x00.')
raise exception below:
Traceback (most recent call last):
File "/usr/local/lib/python3.7/logging/init.py", line 1028, in emit
stream.write(msg + self.terminator)
UnicodeEncodeError: 'utf-8' codec can't encode character '\udc80' in position 173: surrogates not allowed
due to File "/usr/local/lib/python3.7/site-packages/django/db/backends/utils.py", line 111, in execute
logger.debug( '(%.3f) %s; args=%s', duration, sql, params, extra={'duration': duration, 'sql': sql, 'params': params} )
Change History (9)
follow-up: 3 comment:1 by , 5 years ago
Resolution: | → worksforme |
---|---|
Status: | new → closed |
comment:2 by , 5 years ago
It would also be useful to know which database backend you were using because params
might be massaged to different types based on your database backend.
comment:3 by , 5 years ago
Replying to Carlton Gibson:
Hmmm. This seems to be working for me on
master
.
Creating a model as described works as expected.
In [1]: from app.models import JobContext In [2]: JobContext.objects.create(data=b'\x80\x03X\x04\x00\x00\x00xxxxq\x00.') 2019-10-16 17:06:11,151 - DEBUG - django.db.backends - (0.002) INSERT INTO "app_jobcontext" ("data") VALUES (X'800358040000007878787871002E'); args=[<memory at 0x103da5888>] [utils.py:130] 2019-10-16 17:06:11,151 - DEBUG - django.db.backends - (0.002) INSERT INTO "app_jobcontext" ("data") VALUES (X'800358040000007878787871002E'); args=[<memory at 0x103da5888>] [utils.py:130] Out[2]: <JobContext: JobContext object (1)>In particular the error isn't thrown at the
logger.debug()
call.
What are your Python/Django versions? (I see you tagged 2.0)
Python 3.7.4 with Django 2.1.3
Are you able to provide a sample project that reproduces?
comment:4 by , 5 years ago
Version: | 2.0 → 2.1 |
---|
comment:5 by , 5 years ago
Resolution: | worksforme |
---|---|
Status: | closed → new |
OK, thanks for the follow-up. Let me reopen to investigate.
follow-up: 7 comment:6 by , 5 years ago
Resolution: | → invalid |
---|---|
Status: | new → closed |
Summary: | UnicodeEncodeError problem while saving binary to database → UnicodeEncodeError logging error with saving binary with PyMySQL driver. |
Thanks for the docker image. Very helpful!
I think this is a bug with PyMySQL. I suggest moving to mysqlclient
, which is the recommended driver now.
I'm able to reproduce the bug with your image but, changing the driver (and removing the couple of lines from djangotest/__init__.py
) resolves the issue:
root@11f9f5ba1dfb:/usr/src/app# pip freeze Django==2.1.3 PyMySQL==0.9.3 pytz==2019.3 root@11f9f5ba1dfb:/usr/src/app# pip uninstall PyMySQL Uninstalling PyMySQL-0.9.3: Would remove: /usr/local/lib/python3.7/site-packages/PyMySQL-0.9.3.dist-info/* /usr/local/lib/python3.7/site-packages/pymysql/* Proceed (y/n)? y Successfully uninstalled PyMySQL-0.9.3 root@11f9f5ba1dfb:/usr/src/app# pip install mysqlclient Collecting mysqlclient Downloading https://files.pythonhosted.org/packages/4d/38/c5f8bac9c50f3042c8f05615f84206f77f03db79781db841898fde1bb284/mysqlclient-1.4.4.tar.gz (86kB) |████████████████████████████████| 92kB 824kB/s Building wheels for collected packages: mysqlclient Building wheel for mysqlclient (setup.py) ... done Stored in directory: /root/.cache/pip/wheels/a0/04/57/031b9b01df38999df7dc7f4ee998a98ecdbd2d781f73e3ffbf Successfully built mysqlclient Installing collected packages: mysqlclient Successfully installed mysqlclient-1.4.4 WARNING: You are using pip version 19.1.1, however version 19.3 is available. You should consider upgrading via the 'pip install --upgrade pip' command. root@11f9f5ba1dfb:/usr/src/app# python3 manage.py makemigrations Migrations for 'demo': demo/migrations/0001_initial.py - Create model JobContext root@11f9f5ba1dfb:/usr/src/app# python3 manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, demo, sessions Running migrations: No migrations to apply. root@11f9f5ba1dfb:/usr/src/app# python3 manage.py shell Python 3.7.3 (default, Jun 11 2019, 01:05:09) [GCC 6.3.0 20170516] on linux Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> from demo.models import JobContext >>> JobContext.objects.create(data=b'\x80\x03X\x04\x00\x00\x00xxxxq\x00.') <JobContext: JobContext object (2)> >>> now exiting InteractiveConsole... root@11f9f5ba1dfb:/usr/src/app# pip freeze Django==2.1.3 mysqlclient==1.4.4 pytz==2019.3
I'm going to close on that basis.
comment:7 by , 5 years ago
Replying to Carlton Gibson:
Thanks for the docker image. Very helpful!
I think this is a bug with PyMySQL. I suggest moving to
mysqlclient
, which is the recommended driver now.
I'm able to reproduce the bug with your image but, changing the driver (and removing the couple of lines from
djangotest/__init__.py
) resolves the issue:
root@11f9f5ba1dfb:/usr/src/app# pip freeze Django==2.1.3 PyMySQL==0.9.3 pytz==2019.3 root@11f9f5ba1dfb:/usr/src/app# pip uninstall PyMySQL Uninstalling PyMySQL-0.9.3: Would remove: /usr/local/lib/python3.7/site-packages/PyMySQL-0.9.3.dist-info/* /usr/local/lib/python3.7/site-packages/pymysql/* Proceed (y/n)? y Successfully uninstalled PyMySQL-0.9.3 root@11f9f5ba1dfb:/usr/src/app# pip install mysqlclient Collecting mysqlclient Downloading https://files.pythonhosted.org/packages/4d/38/c5f8bac9c50f3042c8f05615f84206f77f03db79781db841898fde1bb284/mysqlclient-1.4.4.tar.gz (86kB) |████████████████████████████████| 92kB 824kB/s Building wheels for collected packages: mysqlclient Building wheel for mysqlclient (setup.py) ... done Stored in directory: /root/.cache/pip/wheels/a0/04/57/031b9b01df38999df7dc7f4ee998a98ecdbd2d781f73e3ffbf Successfully built mysqlclient Installing collected packages: mysqlclient Successfully installed mysqlclient-1.4.4 WARNING: You are using pip version 19.1.1, however version 19.3 is available. You should consider upgrading via the 'pip install --upgrade pip' command. root@11f9f5ba1dfb:/usr/src/app# python3 manage.py makemigrations Migrations for 'demo': demo/migrations/0001_initial.py - Create model JobContext root@11f9f5ba1dfb:/usr/src/app# python3 manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, demo, sessions Running migrations: No migrations to apply. root@11f9f5ba1dfb:/usr/src/app# python3 manage.py shell Python 3.7.3 (default, Jun 11 2019, 01:05:09) [GCC 6.3.0 20170516] on linux Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> from demo.models import JobContext >>> JobContext.objects.create(data=b'\x80\x03X\x04\x00\x00\x00xxxxq\x00.') <JobContext: JobContext object (2)> >>> now exiting InteractiveConsole... root@11f9f5ba1dfb:/usr/src/app# pip freeze Django==2.1.3 mysqlclient==1.4.4 pytz==2019.3I'm going to close on that basis.
OK, it turned out to be pymysql compatible problem, thanks for the help, will follow your suggestion then.
follow-up: 9 comment:8 by , 5 years ago
Resolution: | invalid → duplicate |
---|
For the record this is tracked in #30380 and was fixed in a41b09266dcdd01036d59d76fe926fe0386aaade which is part of the upcoming Django 3.0 release.
comment:9 by , 5 years ago
Replying to Simon Charette:
For the record this is tracked in #30380 and was fixed in a41b09266dcdd01036d59d76fe926fe0386aaade which is part of the upcoming Django 3.0 release.
good to know, thanks.
Hmmm. This seems to be working for me on
master
.Creating a model as described works as expected.
In particular the error isn't thrown at the
logger.debug()
call.What are your Python/Django versions? (I see you tagged 2.0)
Are you able to provide a sample project that reproduces?
Thanks.