Skip to content

Copying auth.User from MySQL does not work as expected #744

Open
@skyl

Description

@skyl

Using 2.2.24 with default pointing to MySQL and "spanner" pointing to new spanner instance

In [32]: u = User.objects.first()                                                                                         

In [33]: u.save(using="spanner")                                                                                          
/repose-cache/py/env/lib/python3.7/site-packages/django/db/backends/utils.py:23: UserWarning: The `rowcount` property is non-operational. Request resulting rows are streamed by the `fetch*()` methods and can't be counted before they are all streamed.
  cursor_attr = getattr(self.cursor, attr)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-33-045c9fec6642> in <module>
----> 1 u.save(using="spanner")

/repose-cache/py/env/lib/python3.7/site-packages/django/contrib/auth/base_user.py in save(self, *args, **kwargs)
     64 
     65     def save(self, *args, **kwargs):
---> 66         super().save(*args, **kwargs)
     67         if self._password is not None:
     68             password_validation.password_changed(self._password, self)

/repose-cache/py/env/lib/python3.7/site-packages/django/db/models/base.py in save(self, force_insert, force_update, using, update_fields)
    742 
    743         self.save_base(using=using, force_insert=force_insert,
--> 744                        force_update=force_update, update_fields=update_fields)
    745     save.alters_data = True
    746 

/repose-cache/py/env/lib/python3.7/site-packages/django/db/models/base.py in save_base(self, raw, force_insert, force_update, using, update_fields)
    780             updated = self._save_table(
    781                 raw, cls, force_insert or parent_inserted,
--> 782                 force_update, using, update_fields,
    783             )
    784         # Store the database on which the object was saved

/repose-cache/py/env/lib/python3.7/site-packages/django/db/models/base.py in _save_table(self, raw, cls, force_insert, force_update, using, update_fields)
    852             forced_update = update_fields or force_update
    853             updated = self._do_update(base_qs, using, pk_val, values, update_fields,
--> 854                                       forced_update)
    855             if force_update and not updated:
    856                 raise DatabaseError("Forced update did not affect any rows.")

/repose-cache/py/env/lib/python3.7/site-packages/django/db/models/base.py in _do_update(self, base_qs, using, pk_val, values, update_fields, forced_update)
    901                 (filtered._update(values) > 0 or filtered.exists())
    902             )
--> 903         return filtered._update(values) > 0
    904 
    905     def _do_insert(self, manager, using, fields, update_pk, raw):

TypeError: '>' not supported between instances of 'NoneType' and 'int'

As an experimental hack, I changed line 903 in django/db/models/base.py to return (filtered._update(values) or 0) > 0. https://github.com/django/django/compare/2.2.25...skyl:spanner-exp?expand=1

That actually "worked" in that I was able to save the user to spanner. But, I wonder if this could be prevented/fixed in django_spanner library.

Metadata

Metadata

Assignees

Labels

🚨This issue needs some love.api: spannerIssues related to the googleapis/python-spanner-django API.priority: p2Moderately-important priority. Fix may not be included in next release.type: bugError or flaw in code with unintended results or allowing sub-optimal usage patterns.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions