mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	[2.0.x] Fixed #28849 -- Fixed referenced table and column rename on SQLite.
Thanks Ramiro for the input and Tim for the review.
Backport of 095c1aaa89 from master
			
			
This commit is contained in:
		| @@ -5,11 +5,14 @@ import unittest | ||||
| from django.core.exceptions import ImproperlyConfigured | ||||
| from django.db import connection | ||||
| from django.db.models import Avg, StdDev, Sum, Variance | ||||
| from django.db.models.fields import CharField | ||||
| from django.db.utils import NotSupportedError | ||||
| from django.test import ( | ||||
|     TestCase, TransactionTestCase, override_settings, skipUnlessDBFeature, | ||||
| ) | ||||
| from django.test.utils import isolate_apps | ||||
|  | ||||
| from ..models import Item, Object, Square | ||||
| from ..models import Author, Item, Object, Square | ||||
|  | ||||
|  | ||||
| @unittest.skipUnless(connection.vendor == 'sqlite', 'SQLite tests') | ||||
| @@ -71,6 +74,44 @@ class Tests(TestCase): | ||||
|                 creation._get_test_db_name() | ||||
|  | ||||
|  | ||||
| @unittest.skipUnless(connection.vendor == 'sqlite', 'SQLite tests') | ||||
| @isolate_apps('backends') | ||||
| class SchemaTests(TransactionTestCase): | ||||
|  | ||||
|     available_apps = ['backends'] | ||||
|  | ||||
|     def test_field_rename_inside_atomic_block(self): | ||||
|         """ | ||||
|         NotImplementedError is raised when a model field rename is attempted | ||||
|         inside an atomic block. | ||||
|         """ | ||||
|         new_field = CharField(max_length=255, unique=True) | ||||
|         new_field.set_attributes_from_name('renamed') | ||||
|         msg = ( | ||||
|             "Renaming the 'backends_author'.'name' column while in a " | ||||
|             "transaction is not supported on SQLite because it would break " | ||||
|             "referential integrity. Try adding `atomic = False` to the " | ||||
|             "Migration class." | ||||
|         ) | ||||
|         with self.assertRaisesMessage(NotSupportedError, msg): | ||||
|             with connection.schema_editor(atomic=True) as editor: | ||||
|                 editor.alter_field(Author, Author._meta.get_field('name'), new_field) | ||||
|  | ||||
|     def test_table_rename_inside_atomic_block(self): | ||||
|         """ | ||||
|         NotImplementedError is raised when a table rename is attempted inside | ||||
|         an atomic block. | ||||
|         """ | ||||
|         msg = ( | ||||
|             "Renaming the 'backends_author' table while in a transaction is " | ||||
|             "not supported on SQLite because it would break referential " | ||||
|             "integrity. Try adding `atomic = False` to the Migration class." | ||||
|         ) | ||||
|         with self.assertRaisesMessage(NotSupportedError, msg): | ||||
|             with connection.schema_editor(atomic=True) as editor: | ||||
|                 editor.alter_db_table(Author, "backends_author", "renamed_table") | ||||
|  | ||||
|  | ||||
| @unittest.skipUnless(connection.vendor == 'sqlite', 'Test only for SQLite') | ||||
| @override_settings(DEBUG=True) | ||||
| class LastExecutedQueryTest(TestCase): | ||||
|   | ||||
		Reference in New Issue
	
	Block a user