mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Fixed #320 -- Changed save() code so that it doesn't rely on cursor.rowcount. MySQLdb sets cursor.rowcount to 0 in an UPDATE statement even if the record already exists. Now save() does a SELECT query to find out whether a record with the primary key already exists.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@507 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
		| @@ -728,13 +728,21 @@ def method_save(opts, self): | |||||||
|     cursor = db.db.cursor() |     cursor = db.db.cursor() | ||||||
|  |  | ||||||
|     # First, try an UPDATE. If that doesn't update anything, do an INSERT. |     # First, try an UPDATE. If that doesn't update anything, do an INSERT. | ||||||
|     pk_set = bool(getattr(self, opts.pk.name)) |     pk_val = getattr(self, opts.pk.name) | ||||||
|  |     pk_set = bool(pk_val) | ||||||
|  |     record_exists = True | ||||||
|     if pk_set: |     if pk_set: | ||||||
|         db_values = [f.get_db_prep_save(f.pre_save(getattr(self, f.name), False)) for f in non_pks] |         # Determine whether a record with the primary key already exists. | ||||||
|         cursor.execute("UPDATE %s SET %s WHERE %s=%%s" % (opts.db_table, |         cursor.execute("SELECT 1 FROM %s WHERE %s=%%s LIMIT 1" % (opts.db_table, opts.pk.name), [pk_val]) | ||||||
|             ','.join(['%s=%%s' % f.name for f in non_pks]), opts.pk.name), |         # If it does already exist, do an UPDATE. | ||||||
|             db_values + [getattr(self, opts.pk.name)]) |         if cursor.rowcount > 0: | ||||||
|     if not pk_set or cursor.rowcount == 0: |             db_values = [f.get_db_prep_save(f.pre_save(getattr(self, f.name), False)) for f in non_pks] | ||||||
|  |             cursor.execute("UPDATE %s SET %s WHERE %s=%%s" % (opts.db_table, | ||||||
|  |                 ','.join(['%s=%%s' % f.name for f in non_pks]), opts.pk.name), | ||||||
|  |                 db_values + [pk_val]) | ||||||
|  |         else: | ||||||
|  |             record_exists = False | ||||||
|  |     if not pk_set or not record_exists: | ||||||
|         field_names = [f.name for f in opts.fields if not isinstance(f, AutoField)] |         field_names = [f.name for f in opts.fields if not isinstance(f, AutoField)] | ||||||
|         placeholders = ['%s'] * len(field_names) |         placeholders = ['%s'] * len(field_names) | ||||||
|         db_values = [f.get_db_prep_save(f.pre_save(getattr(self, f.name), True)) for f in opts.fields if not isinstance(f, AutoField)] |         db_values = [f.get_db_prep_save(f.pre_save(getattr(self, f.name), True)) for f in opts.fields if not isinstance(f, AutoField)] | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user