#30224: Mysql Datetime value is string instead of datetime object
-------------------------------+--------------------------------------
Reporter: upMKuhn | Owner: nobody
Type: Uncategorized | Status: new
Component: Uncategorized | Version: 2.2
Severity: Normal | Resolution:
Keywords: Mysql | Triage Stage: Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------+--------------------------------------
Description changed by upMKuhn:
Old description:
> **The Problem**
> Datetimes are sometimes returned as objects or strings. It depends on the
> value. E.g. '2019-03-01 00:00:00.000000' is returned as a string,
> while`2018-12-12 22:02:53.134000` is provided as a datetime object in the
> sql/compiler.py.
>
> **My Table**
> >
> > CREATE TABLE `myTable` (
> > `id` char(32) COLLATE utf8mb4_unicode_ci NOT NULL,
> > `created_on` datetime(6) NOT NULL,
> > `modified_on` datetime(6) NOT NULL,
> > `first_spot_broadcast` datetime(6) DEFAULT NULL,
> > `expiry_date` datetime(6) DEFAULT NULL
> > )
>
> DB driver: django.db.backends.mysql
> Django version: 2.0.4 tried 2.2 as well
> DRF 3.8.2
> mysqlclient = "==1.4.2"
>
> This issue only occurred for me when I execute this query.
>
> {{{
> .annotate(
> minExpiryDate=Min('buyout__expiry_date',
> filter=Q(buyout__is_archived=False, buyout__is_deleted=False))) \
> .filter(Q(minExpiryDate__gte=(now + expiryInterval))
> & Q(minExpiryDate__lte=(now + expiryInterval +
> timedelta(days=1))))
> }}}
>
> I tried upgrading to 2.2 and the issue persisted.
>
>
> **My stack trace is:
> **
> {{{
> Traceback (most recent call last):
> File "/usr/share/pycharm/helpers/pydev/pydevd.py", line 1741, in
> <module>
> main()
> File "/usr/share/pycharm/helpers/pydev/pydevd.py", line 1735, in main
> globals = debugger.run(setup['file'], None, None, is_module)
> File "/usr/share/pycharm/helpers/pydev/pydevd.py", line 1135, in run
> pydev_imports.execfile(file, globals, locals) # execute the script
> File "/usr/share/pycharm/helpers/pydev/_pydev_imps/_pydev_execfile.py",
> line 18, in execfile
> exec(compile(contents+"\n", file, 'exec'), glob, loc)
> File "/server/manage.py", line 15, in <module>
> execute_from_command_line(sys.argv)
> File "site-packages/django/core/management/__init__.py", line 381, in
> execute_from_command_line
> utility.execute()
> File "site-packages/django/core/management/__init__.py", line 375, in
> execute
> self.fetch_command(subcommand).run_from_argv(self.argv)
> File "site-packages/django/core/management/base.py", line 316, in
> run_from_argv
> self.execute(*args, **cmd_options)
> File "site-packages/django/core/management/base.py", line 353, in
> execute
> output = self.handle(*args, **options)
> File
> "/server/buyout/management/commands/send_expiry_reminder_email.py", line
> 8, in handle
> send_expiry_reminder_summary()
> File "site-packages/celery/local.py", line 191, in __call__
> return self._get_current_object()(*a, **kw)
> File "site-packages/celery/app/task.py", line 375, in __call__
> return self.run(*args, **kwargs)
> File "/server/buyout/tasks/expiry_reminder.py", line 46, in
> send_expiry_reminder_summary
> if len(projects_expiring) > 0:
> File "site-packages/django/db/models/query.py", line 250, in __len__
> self._fetch_all()
> File "site-packages/django/db/models/query.py", line 1186, in
> _fetch_all
> self._result_cache = list(self._iterable_class(self))
> File "site-packages/django/db/models/query.py", line 63, in __iter__
> for row in compiler.results_iter(results):
> File "site-packages/django/db/models/sql/compiler.py", line 1009, in
> apply_converters
> value = converter(value, expression, connection)
> File "site-packages/django/db/backends/mysql/operations.py", line 252,
> in convert_datetimefield_value
> value = timezone.make_aware(value, self.connection.timezone)
> File "site-packages/django/utils/timezone.py", line 264, in make_aware
> return timezone.localize(value, is_dst=is_dst)
> File "site-packages/pytz/__init__.py", line 222, in localize
> if dt.tzinfo is not None:
> AttributeError: 'str' object has no attribute 'tzinfo'
> Exception ignored in: <generator object cursor_iter at 0x7f7ab3f88390>
> Traceback (most recent call last):
> File "site-packages/django/db/models/sql/compiler.py", line 1469, in
> cursor_iter
> cursor.close()
> File "site-packages/MySQLdb/cursors.py", line 86, in close
> while self.nextset():
> File "site-packages/MySQLdb/cursors.py", line 136, in nextset
> nr = db.next_result()
> MySQLdb._exceptions.OperationalError: (2006, '')
> }}}
New description:
**The Problem**
Datetimes are sometimes returned as objects or strings. It depends on the
value. E.g. '2019-03-01 00:00:00.000000' is returned as a string,
while`2018-12-12 22:02:53.134000` is provided as a datetime object in the
sql/compiler.py.
My Table
> CREATE TABLE `myTable` (
> `id` char(32) COLLATE utf8mb4_unicode_ci NOT NULL,
> `created_on` datetime(6) NOT NULL,
> `modified_on` datetime(6) NOT NULL,
> `first_spot_broadcast` datetime(6) DEFAULT NULL,
> `expiry_date` datetime(6) DEFAULT NULL
> )
DB driver: django.db.backends.mysql
Django version: 2.0.4 tried 2.2 as well
DRF 3.8.2
mysqlclient = "==1.4.2"
This issue only occurred for me when I execute this query. I tried
upgrading to 2.2 and the issue persisted.
{{{
.annotate(
minExpiryDate=Min('buyout__expiry_date',
filter=Q(buyout__is_archived=False, buyout__is_deleted=False))) \
.filter(Q(minExpiryDate__gte=(now + expiryInterval))
& Q(minExpiryDate__lte=(now + expiryInterval +
timedelta(days=1))))
}}}
**My stack trace is:
**
{{{
Traceback (most recent call last):
File "/usr/share/pycharm/helpers/pydev/pydevd.py", line 1741, in
<module>
main()
File "/usr/share/pycharm/helpers/pydev/pydevd.py", line 1735, in main
globals = debugger.run(setup['file'], None, None, is_module)
File "/usr/share/pycharm/helpers/pydev/pydevd.py", line 1135, in run
pydev_imports.execfile(file, globals, locals) # execute the script
File "/usr/share/pycharm/helpers/pydev/_pydev_imps/_pydev_execfile.py",
line 18, in execfile
exec(compile(contents+"\n", file, 'exec'), glob, loc)
File "/server/manage.py", line 15, in <module>
execute_from_command_line(sys.argv)
File "site-packages/django/core/management/__init__.py", line 381, in
execute_from_command_line
utility.execute()
File "site-packages/django/core/management/__init__.py", line 375, in
execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "site-packages/django/core/management/base.py", line 316, in
run_from_argv
self.execute(*args, **cmd_options)
File "site-packages/django/core/management/base.py", line 353, in
execute
output = self.handle(*args, **options)
File "/server/buyout/management/commands/send_expiry_reminder_email.py",
line 8, in handle
send_expiry_reminder_summary()
File "site-packages/celery/local.py", line 191, in __call__
return self._get_current_object()(*a, **kw)
File "site-packages/celery/app/task.py", line 375, in __call__
return self.run(*args, **kwargs)
File "/server/buyout/tasks/expiry_reminder.py", line 46, in
send_expiry_reminder_summary
if len(projects_expiring) > 0:
File "site-packages/django/db/models/query.py", line 250, in __len__
self._fetch_all()
File "site-packages/django/db/models/query.py", line 1186, in _fetch_all
self._result_cache = list(self._iterable_class(self))
File "site-packages/django/db/models/query.py", line 63, in __iter__
for row in compiler.results_iter(results):
File "site-packages/django/db/models/sql/compiler.py", line 1009, in
apply_converters
value = converter(value, expression, connection)
File "site-packages/django/db/backends/mysql/operations.py", line 252,
in convert_datetimefield_value
value = timezone.make_aware(value, self.connection.timezone)
File "site-packages/django/utils/timezone.py", line 264, in make_aware
return timezone.localize(value, is_dst=is_dst)
File "site-packages/pytz/__init__.py", line 222, in localize
if dt.tzinfo is not None:
AttributeError: 'str' object has no attribute 'tzinfo'
Exception ignored in: <generator object cursor_iter at 0x7f7ab3f88390>
Traceback (most recent call last):
File "site-packages/django/db/models/sql/compiler.py", line 1469, in
cursor_iter
cursor.close()
File "site-packages/MySQLdb/cursors.py", line 86, in close
while self.nextset():
File "site-packages/MySQLdb/cursors.py", line 136, in nextset
nr = db.next_result()
MySQLdb._exceptions.OperationalError: (2006, '')
}}}
--
--
Ticket URL: <https://code.djangoproject.com/ticket/30224#comment:1>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/065.273d120ce93c8e883b73c39d7c43efd9%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.