Proposal to re-open #27017 (updating only dirty fields in save())

2019-01-28 Thread Daniel Tao
Hi!

This is my first post on this list. I recently left a comment on #27017 
 requesting to 
re-open the topic of only saving dirty fields in save(). Tim Graham 
helpfully directed to #4102  and 
advised that I make the proposal on the dev mailing list, so that's what 
I'm doing :)

I've gone through the history of #4102 and taken notes on the challenges 
that arose when this was first attempted 12 years ago (!). The TL;DR is 
that, while there were indeed quite a few complications, I don't see 
anything that came up that should be considered a flat-out showstopper. 
Rather, what happened was that at about the 69th comment 
, back in 2012, the 
conversation shifted as Matt Long made this observation:

what started as a simple opt-in feature request of adding a field 
> white-list to the Model's save function morphed into a complicated dirty 
> flag approach that obviously has many edge cases and performance 
> implications given that this ticket has been open for 5 years now


>From here it seems things progressed towards the current solution of 
supporting the update_fields argument, and that's where things ended. I 
would like to point out that Matt did *not* advocate for completely 
abandoning all efforts to support dirty field tracking; to the contrary, in 
the same comment he said this (emphasis mine):

Clearly some people feel differently and favor the dirty flag approach for 
> a more hands-off approach. As such, I propose adding support for *both 
> methods*


With that in mind, I believe it's worth re-opening this discussion. For a 
fairly lengthy justification, see my aforementioned comment on #27017 
. I'll copy the 
effective TL;DR of the proposal here for convenience:

In my opinion Django could make most code bases inherently more resilient 
> against latent race conditions by implementing some form of dirty field 
> tracking and effectively providing the functionality of update_fields 
> automatically. I would like to propose a new setting, something like 
> SAVE_UPDATE_DIRTY_FIELDS_ONLY, to change the ORM's default behavior so 
> that calls to Model.save() only update the fields that have been set on 
> the model instance. Naturally for backwards compatibility this setting 
> would be False by default.


As for the concerns that were raised when this was first attempted, I will 
now attempt to summarize what I found along with, in most cases, a bit of 
editorializing from me.

Performance

The performance angle was first explored in a comment 
 that said it 
"doesn't look good" and provided some benchmarks showing a performance hit 
from 0.17s to 2.64s for setting an attribute using the timeit 
 package. I didn't see 
anyone point out that the timeit method defaults to executing code *a 
million times*; so the throughput of the operation went from about 6 
million to closer to 400 thousand times per second. (The percentage change 
is indeed significant, but this doesn't *smell* like a potential 
bottleneck.)

It was noted in a couple 
 places 
 that it seems 
potentially shortsighted to focus so much on the performance of getting and 
setting attributes without taking into account the potential performance 
*benefits* of executing smaller UPDATE statements that write fewer columns. 
As far as I can tell, no one in the thread on #4102 actively investigated 
the latter.

Based on the unlikelihood of attribute setting representing a performance 
bottleneck, and the lack of data for the performance impact of executing 
smaller updates, I would consider the performance discussion largely a 
distraction. Though I do think it's worth measuring the latter.

Compatibility

It was observed that the two approaches considered on the ticket 
(overriding __setattr__ or defining custom property setters) would not work 
with obj.__dict__.update 
, which is 
apparently an optimization you can find prescribed on some blogs out int he 
wild. This supports the premise that this behavior should be opt in, so 
devs who are using incompatible techniques can stay away (unless/until 
they've removed those optimizations from their code).

I had already suggested putting this functionality behind a setting, so I 
think we're good here.

Correctness

There were some bugs related to 
 multi-table 
inheritance . It 
appears these were both followed by patches with proposed fixes.

Another bug was that fields updated in pre_save such as 
DateTime

connection between django and mysql

2019-01-28 Thread Desh Deepak
Hi, everyone i unable to install mysql client in cmd. when i going for
connect to mysql database using django for web project.

error message showed me in cmd.

"""
Microsoft Windows [Version 10.0.16299.15]
(c) 2017 Microsoft Corporation. All rights reserved.

C:\Users\deshd>pip install django mysqlclient
Requirement already satisfied: django in
c:\users\deshd\appdata\local\programs\python\python37-32\lib\site-packages
(2.1.4)
Collecting mysqlclient
  Using cached
https://files.pythonhosted.org/packages/de/d7/919042fb7ed78a89e21c4e43d5daed90d5df18ec183bae3de493a7d9e3ed/mysqlclient-1.4.1.tar.gz
Requirement already satisfied: pytz in
c:\users\deshd\appdata\local\programs\python\python37-32\lib\site-packages
(from django) (2018.5)
Building wheels for collected packages: mysqlclient
  Building wheel for mysqlclient (setup.py) ... error
  Complete output from command
c:\users\deshd\appdata\local\programs\python\python37-32\python.exe -u -c
"import setuptools,
tokenize;__file__='C:\\Users\\deshd\\AppData\\Local\\Temp\\pip-install-tgvhtai_\\mysqlclient\\setup.py';f=getattr(tokenize,
'open', open)(__file__);code=f.read().replace('\r\n',
'\n');f.close();exec(compile(code, __file__, 'exec'))" bdist_wheel -d
C:\Users\deshd\AppData\Local\Temp\pip-wheel-7wirzw5i --python-tag cp37:
  running bdist_wheel
  running build
  running build_py
  creating build
  creating build\lib.win32-3.7
  creating build\lib.win32-3.7\MySQLdb
  copying MySQLdb\__init__.py -> build\lib.win32-3.7\MySQLdb
  copying MySQLdb\_exceptions.py -> build\lib.win32-3.7\MySQLdb
  copying MySQLdb\compat.py -> build\lib.win32-3.7\MySQLdb
  copying MySQLdb\connections.py -> build\lib.win32-3.7\MySQLdb
  copying MySQLdb\converters.py -> build\lib.win32-3.7\MySQLdb
  copying MySQLdb\cursors.py -> build\lib.win32-3.7\MySQLdb
  copying MySQLdb\release.py -> build\lib.win32-3.7\MySQLdb
  copying MySQLdb\times.py -> build\lib.win32-3.7\MySQLdb
  creating build\lib.win32-3.7\MySQLdb\constants
  copying MySQLdb\constants\__init__.py ->
build\lib.win32-3.7\MySQLdb\constants
  copying MySQLdb\constants\CLIENT.py ->
build\lib.win32-3.7\MySQLdb\constants
  copying MySQLdb\constants\CR.py -> build\lib.win32-3.7\MySQLdb\constants
  copying MySQLdb\constants\ER.py -> build\lib.win32-3.7\MySQLdb\constants
  copying MySQLdb\constants\FIELD_TYPE.py ->
build\lib.win32-3.7\MySQLdb\constants
  copying MySQLdb\constants\FLAG.py -> build\lib.win32-3.7\MySQLdb\constants
  running build_ext
  building 'MySQLdb._mysql' extension
  error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft
Visual C++ Build Tools": https://visualstudio.microsoft.com/downloads/

  
  Failed building wheel for mysqlclient
  Running setup.py clean for mysqlclient
Failed to build mysqlclient
Installing collected packages: mysqlclient
  Running setup.py install for mysqlclient ... error
Complete output from command
c:\users\deshd\appdata\local\programs\python\python37-32\python.exe -u -c
"import setuptools,
tokenize;__file__='C:\\Users\\deshd\\AppData\\Local\\Temp\\pip-install-tgvhtai_\\mysqlclient\\setup.py';f=getattr(tokenize,
'open', open)(__file__);code=f.read().replace('\r\n',
'\n');f.close();exec(compile(code, __file__, 'exec'))" install --record
C:\Users\deshd\AppData\Local\Temp\pip-record-ykdv80km\install-record.txt
--single-version-externally-managed --compile:
running install
running build
running build_py
creating build
creating build\lib.win32-3.7
creating build\lib.win32-3.7\MySQLdb
copying MySQLdb\__init__.py -> build\lib.win32-3.7\MySQLdb
copying MySQLdb\_exceptions.py -> build\lib.win32-3.7\MySQLdb
copying MySQLdb\compat.py -> build\lib.win32-3.7\MySQLdb
copying MySQLdb\connections.py -> build\lib.win32-3.7\MySQLdb
copying MySQLdb\converters.py -> build\lib.win32-3.7\MySQLdb
copying MySQLdb\cursors.py -> build\lib.win32-3.7\MySQLdb
copying MySQLdb\release.py -> build\lib.win32-3.7\MySQLdb
copying MySQLdb\times.py -> build\lib.win32-3.7\MySQLdb
creating build\lib.win32-3.7\MySQLdb\constants
copying MySQLdb\constants\__init__.py ->
build\lib.win32-3.7\MySQLdb\constants
copying MySQLdb\constants\CLIENT.py ->
build\lib.win32-3.7\MySQLdb\constants
copying MySQLdb\constants\CR.py -> build\lib.win32-3.7\MySQLdb\constants
copying MySQLdb\constants\ER.py -> build\lib.win32-3.7\MySQLdb\constants
copying MySQLdb\constants\FIELD_TYPE.py ->
build\lib.win32-3.7\MySQLdb\constants
copying MySQLdb\constants\FLAG.py ->
build\lib.win32-3.7\MySQLdb\constants
running build_ext
building 'MySQLdb._mysql' extension
*error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft
Visual C++ Build Tools": https://visualstudio.microsoft.com/downloads/
*
""

Re: connection between django and mysql

2019-01-28 Thread Adam Johnson
This mailing list is for the development of Django itself, not for support
using Django. Please use. the django-users mailing list for that, or IRC
#django on freenode, or a site like Stack Overflow.

Additionally your problem is not related to Django but to installing
mysqlclient, a package that Django uses. Whilst I've used that library I
have no experience around windows setup issues. The package is at
https://pypi.org/project/mysqlclient/ , with its homepage at
https://github.com/PyMySQL/mysqlclient-python , you might be able to find
support on the issues there (check through old closed issues first before
raising a new one).

Hope that helps,

Adam

On Mon, 28 Jan 2019 at 17:40, Desh Deepak  wrote:

> Hi, everyone i unable to install mysql client in cmd. when i going for
> connect to mysql database using django for web project.
>
> error message showed me in cmd.
>
>
> """
> Microsoft Windows [Version 10.0.16299.15]
> (c) 2017 Microsoft Corporation. All rights reserved.
>
> C:\Users\deshd>pip install django mysqlclient
> Requirement already satisfied: django in
> c:\users\deshd\appdata\local\programs\python\python37-32\lib\site-packages
> (2.1.4)
> Collecting mysqlclient
>   Using cached
> https://files.pythonhosted.org/packages/de/d7/919042fb7ed78a89e21c4e43d5daed90d5df18ec183bae3de493a7d9e3ed/mysqlclient-1.4.1.tar.gz
> Requirement already satisfied: pytz in
> c:\users\deshd\appdata\local\programs\python\python37-32\lib\site-packages
> (from django) (2018.5)
> Building wheels for collected packages: mysqlclient
>   Building wheel for mysqlclient (setup.py) ... error
>   Complete output from command
> c:\users\deshd\appdata\local\programs\python\python37-32\python.exe -u -c
> "import setuptools,
> tokenize;__file__='C:\\Users\\deshd\\AppData\\Local\\Temp\\pip-install-tgvhtai_\\mysqlclient\\setup.py';f=getattr(tokenize,
> 'open', open)(__file__);code=f.read().replace('\r\n',
> '\n');f.close();exec(compile(code, __file__, 'exec'))" bdist_wheel -d
> C:\Users\deshd\AppData\Local\Temp\pip-wheel-7wirzw5i --python-tag cp37:
>   running bdist_wheel
>   running build
>   running build_py
>   creating build
>   creating build\lib.win32-3.7
>   creating build\lib.win32-3.7\MySQLdb
>   copying MySQLdb\__init__.py -> build\lib.win32-3.7\MySQLdb
>   copying MySQLdb\_exceptions.py -> build\lib.win32-3.7\MySQLdb
>   copying MySQLdb\compat.py -> build\lib.win32-3.7\MySQLdb
>   copying MySQLdb\connections.py -> build\lib.win32-3.7\MySQLdb
>   copying MySQLdb\converters.py -> build\lib.win32-3.7\MySQLdb
>   copying MySQLdb\cursors.py -> build\lib.win32-3.7\MySQLdb
>   copying MySQLdb\release.py -> build\lib.win32-3.7\MySQLdb
>   copying MySQLdb\times.py -> build\lib.win32-3.7\MySQLdb
>   creating build\lib.win32-3.7\MySQLdb\constants
>   copying MySQLdb\constants\__init__.py ->
> build\lib.win32-3.7\MySQLdb\constants
>   copying MySQLdb\constants\CLIENT.py ->
> build\lib.win32-3.7\MySQLdb\constants
>   copying MySQLdb\constants\CR.py -> build\lib.win32-3.7\MySQLdb\constants
>   copying MySQLdb\constants\ER.py -> build\lib.win32-3.7\MySQLdb\constants
>   copying MySQLdb\constants\FIELD_TYPE.py ->
> build\lib.win32-3.7\MySQLdb\constants
>   copying MySQLdb\constants\FLAG.py ->
> build\lib.win32-3.7\MySQLdb\constants
>   running build_ext
>   building 'MySQLdb._mysql' extension
>   error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft
> Visual C++ Build Tools": https://visualstudio.microsoft.com/downloads/
>
>   
>   Failed building wheel for mysqlclient
>   Running setup.py clean for mysqlclient
> Failed to build mysqlclient
> Installing collected packages: mysqlclient
>   Running setup.py install for mysqlclient ... error
> Complete output from command
> c:\users\deshd\appdata\local\programs\python\python37-32\python.exe -u -c
> "import setuptools,
> tokenize;__file__='C:\\Users\\deshd\\AppData\\Local\\Temp\\pip-install-tgvhtai_\\mysqlclient\\setup.py';f=getattr(tokenize,
> 'open', open)(__file__);code=f.read().replace('\r\n',
> '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record
> C:\Users\deshd\AppData\Local\Temp\pip-record-ykdv80km\install-record.txt
> --single-version-externally-managed --compile:
> running install
> running build
> running build_py
> creating build
> creating build\lib.win32-3.7
> creating build\lib.win32-3.7\MySQLdb
> copying MySQLdb\__init__.py -> build\lib.win32-3.7\MySQLdb
> copying MySQLdb\_exceptions.py -> build\lib.win32-3.7\MySQLdb
> copying MySQLdb\compat.py -> build\lib.win32-3.7\MySQLdb
> copying MySQLdb\connections.py -> build\lib.win32-3.7\MySQLdb
> copying MySQLdb\converters.py -> build\lib.win32-3.7\MySQLdb
> copying MySQLdb\cursors.py -> build\lib.win32-3.7\MySQLdb
> copying MySQLdb\release.py -> build\lib.win32-3.7\MySQLdb
> copying MySQLdb\times.py -> build\l