summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaude Paroz <claude@2xlibre.net>2014-07-05 20:48:57 +0200
committerClaude Paroz <claude@2xlibre.net>2014-07-06 21:19:27 +0200
commitb144bfb5ce1e3e283c7fddac29a4653c6bc7fb3f (patch)
treefdc4a0e9b491aa5cfa07549126c97497456b9b44
parent2572c07cc64177e985b453d0f0b819e85fe080cc (diff)
Fixed #21079 -- Further normalized table names in inspectdb
Thanks Michael Manfre for the report and Tim Graham for the review.
-rw-r--r--django/core/management/commands/inspectdb.py2
-rw-r--r--tests/inspectdb/models.py5
-rw-r--r--tests/inspectdb/tests.py16
3 files changed, 20 insertions, 3 deletions
diff --git a/django/core/management/commands/inspectdb.py b/django/core/management/commands/inspectdb.py
index 7feef23b08..91aa3255d7 100644
--- a/django/core/management/commands/inspectdb.py
+++ b/django/core/management/commands/inspectdb.py
@@ -32,7 +32,7 @@ class Command(BaseCommand):
# 'table_name_filter' is a stealth option
table_name_filter = options.get('table_name_filter')
- table2model = lambda table_name: table_name.title().replace('_', '').replace(' ', '').replace('-', '')
+ table2model = lambda table_name: re.sub(r'[^a-zA-Z0-9]', '', table_name.title())
strip_prefix = lambda s: s[1:] if s.startswith("u'") else s
with connection.cursor() as cursor:
diff --git a/tests/inspectdb/models.py b/tests/inspectdb/models.py
index f7c8af73c6..6b55ca7881 100644
--- a/tests/inspectdb/models.py
+++ b/tests/inspectdb/models.py
@@ -30,7 +30,7 @@ class DigitsInColumnName(models.Model):
leading_digits = models.CharField(max_length=11, db_column='45extra')
-class SpecialColumnName(models.Model):
+class SpecialName(models.Model):
field = models.IntegerField(db_column='field')
# Underscores
field_field_0 = models.IntegerField(db_column='Field_')
@@ -40,6 +40,9 @@ class SpecialColumnName(models.Model):
prc_x = models.IntegerField(db_column='prc(%) x')
non_ascii = models.IntegerField(db_column='tamaƱo')
+ class Meta:
+ db_table = "inspectdb_special.table name"
+
class ColumnTypes(models.Model):
id = models.AutoField(primary_key=True)
diff --git a/tests/inspectdb/tests.py b/tests/inspectdb/tests.py
index c0502198d8..2fa4e25453 100644
--- a/tests/inspectdb/tests.py
+++ b/tests/inspectdb/tests.py
@@ -179,7 +179,9 @@ class InspectDBTestCase(TestCase):
unsuitable for Python identifiers
"""
out = StringIO()
- call_command('inspectdb', stdout=out)
+ call_command('inspectdb',
+ table_name_filter=lambda tn: tn.startswith('inspectdb_'),
+ stdout=out)
output = out.getvalue()
base_name = 'Field' if not connection.features.uppercases_column_names else 'field'
self.assertIn("field = models.IntegerField()", output)
@@ -193,6 +195,18 @@ class InspectDBTestCase(TestCase):
else:
self.assertIn("tama_o = models.IntegerField(db_column='tama\\xf1o')", output)
+ def test_table_name_introspection(self):
+ """
+ Introspection of table names containing special characters,
+ unsuitable for Python identifiers
+ """
+ out = StringIO()
+ call_command('inspectdb',
+ table_name_filter=lambda tn: tn.startswith('inspectdb_'),
+ stdout=out)
+ output = out.getvalue()
+ self.assertIn("class InspectdbSpecialTableName(models.Model):", output)
+
def test_managed_models(self):
"""Test that by default the command generates models with `Meta.managed = False` (#14305)"""
out = StringIO()