Fixed #24846 -- Added support to MySQL SchemaEditor for all blob/text data types
This commit is contained in:
parent
00e8e514e1
commit
e60cce4e40
1
AUTHORS
1
AUTHORS
|
@ -8,6 +8,7 @@ answer newbie questions, and generally made Django that much better:
|
||||||
Aaron Cannon <cannona@fireantproductions.com>
|
Aaron Cannon <cannona@fireantproductions.com>
|
||||||
Aaron Swartz <http://www.aaronsw.com/>
|
Aaron Swartz <http://www.aaronsw.com/>
|
||||||
Aaron T. Myers <atmyers@gmail.com>
|
Aaron T. Myers <atmyers@gmail.com>
|
||||||
|
Adam Johnson <https://github.com/adamchainz>
|
||||||
Adam Vandenberg
|
Adam Vandenberg
|
||||||
Adrian Holovaty <adrian@holovaty.com>
|
Adrian Holovaty <adrian@holovaty.com>
|
||||||
Adrien Lemaire <lemaire.adrien@gmail.com>
|
Adrien Lemaire <lemaire.adrien@gmail.com>
|
||||||
|
|
|
@ -34,10 +34,17 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
|
||||||
|
|
||||||
def skip_default(self, field):
|
def skip_default(self, field):
|
||||||
"""
|
"""
|
||||||
MySQL doesn't accept default values for longtext and longblob
|
MySQL doesn't accept default values for TEXT and BLOB types, and
|
||||||
and implicitly treats these columns as nullable.
|
implicitly treats these columns as nullable.
|
||||||
"""
|
"""
|
||||||
return field.db_type(self.connection) in {'longtext', 'longblob'}
|
db_type = field.db_type(self.connection)
|
||||||
|
return (
|
||||||
|
db_type is not None and
|
||||||
|
db_type.lower() in {
|
||||||
|
'tinyblob', 'blob', 'mediumblob', 'longblob',
|
||||||
|
'tinytext', 'text', 'mediumtext', 'longtext',
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
def add_field(self, model, field):
|
def add_field(self, model, field):
|
||||||
super(DatabaseSchemaEditor, self).add_field(model, field)
|
super(DatabaseSchemaEditor, self).add_field(model, field)
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
from django.db import models
|
||||||
from django.db.models.fields.related import (
|
from django.db.models.fields.related import (
|
||||||
RECURSIVE_RELATIONSHIP_CONSTANT, ManyRelatedObjectsDescriptor,
|
RECURSIVE_RELATIONSHIP_CONSTANT, ManyRelatedObjectsDescriptor,
|
||||||
ManyToManyField, ManyToManyRel, RelatedField,
|
ManyToManyField, ManyToManyRel, RelatedField,
|
||||||
|
@ -56,3 +57,11 @@ class CustomManyToManyField(RelatedField):
|
||||||
|
|
||||||
class InheritedManyToManyField(ManyToManyField):
|
class InheritedManyToManyField(ManyToManyField):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class MediumBlobField(models.BinaryField):
|
||||||
|
"""
|
||||||
|
A MySQL BinaryField that uses a different blob size.
|
||||||
|
"""
|
||||||
|
def db_type(self, connection):
|
||||||
|
return 'MEDIUMBLOB'
|
||||||
|
|
|
@ -17,7 +17,9 @@ from django.db.models.fields.related import (
|
||||||
from django.db.transaction import atomic
|
from django.db.transaction import atomic
|
||||||
from django.test import TransactionTestCase, skipIfDBFeature
|
from django.test import TransactionTestCase, skipIfDBFeature
|
||||||
|
|
||||||
from .fields import CustomManyToManyField, InheritedManyToManyField
|
from .fields import (
|
||||||
|
CustomManyToManyField, InheritedManyToManyField, MediumBlobField,
|
||||||
|
)
|
||||||
from .models import (
|
from .models import (
|
||||||
Author, AuthorWithDefaultHeight, AuthorWithEvenLongerName, Book, BookWeak,
|
Author, AuthorWithDefaultHeight, AuthorWithEvenLongerName, Book, BookWeak,
|
||||||
BookWithLongName, BookWithO2O, BookWithSlug, Note, NoteRename, Tag,
|
BookWithLongName, BookWithO2O, BookWithSlug, Note, NoteRename, Tag,
|
||||||
|
@ -383,6 +385,23 @@ class SchemaTests(TransactionTestCase):
|
||||||
# these two types.
|
# these two types.
|
||||||
self.assertIn(columns['bits'][0], ("BinaryField", "TextField"))
|
self.assertIn(columns['bits'][0], ("BinaryField", "TextField"))
|
||||||
|
|
||||||
|
@unittest.skipUnless(connection.vendor == 'mysql', "MySQL specific")
|
||||||
|
def test_add_binaryfield_mediumblob(self):
|
||||||
|
"""
|
||||||
|
Test adding a custom-sized binary field on MySQL (#24846).
|
||||||
|
"""
|
||||||
|
# Create the table
|
||||||
|
with connection.schema_editor() as editor:
|
||||||
|
editor.create_model(Author)
|
||||||
|
# Add the new field with default
|
||||||
|
new_field = MediumBlobField(blank=True, default=b'123')
|
||||||
|
new_field.set_attributes_from_name('bits')
|
||||||
|
with connection.schema_editor() as editor:
|
||||||
|
editor.add_field(Author, new_field)
|
||||||
|
columns = self.column_classes(Author)
|
||||||
|
# Introspection treats BLOBs as TextFields
|
||||||
|
self.assertEqual(columns['bits'][0], "TextField")
|
||||||
|
|
||||||
def test_alter(self):
|
def test_alter(self):
|
||||||
"""
|
"""
|
||||||
Tests simple altering of fields
|
Tests simple altering of fields
|
||||||
|
|
Loading…
Reference in New Issue