Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Fixed #18843 -- Replaced more special chars in column names (inspectdb)

Thanks airstrike for the report.
  • Loading branch information...
commit f5ea730dac0986b2d48889a2d0fab2c5befb4494 1 parent 395c608
@claudep claudep authored
View
15 django/core/management/commands/inspectdb.py
@@ -1,6 +1,7 @@
from __future__ import unicode_literals
import keyword
+import re
from optparse import make_option
from django.core.management.base import NoArgsCommand, CommandError
@@ -142,18 +143,16 @@ def normalize_col_name(self, col_name, used_column_names, is_relation):
else:
field_params['db_column'] = col_name
- if ' ' in new_name:
- new_name = new_name.replace(' ', '_')
- field_notes.append('Field renamed to remove spaces.')
-
- if '-' in new_name:
- new_name = new_name.replace('-', '_')
- field_notes.append('Field renamed to remove dashes.')
+ new_name, num_repl = re.subn(r'\W', '_', new_name)
+ if num_repl > 0:
+ field_notes.append('Field renamed to remove unsuitable characters.')
if new_name.find('__') >= 0:

Shouldn't it be
if new_name.find('') >0:

instead of
if new_name.find('
') >= 0: ?
same goes for the following conditions. Please correct me if I am wrong. Thanks!

@ramiro Collaborator
ramiro added a note

@mageshkhanna

From help(str.find) output: S.find(sub [,start [,end]]) -> int -- Return the lowest index in S where substring sub is found [...] Return -1 on failure.

So, the code is correct as it is.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
while new_name.find('__') >= 0:
new_name = new_name.replace('__', '_')
- field_notes.append("Field renamed because it contained more than one '_' in a row.")
+ if col_name.lower().find('__') >= 0:
+ # Only add the comment if the double underscore was in the original name
+ field_notes.append("Field renamed because it contained more than one '_' in a row.")
if new_name.startswith('_'):
new_name = 'field%s' % new_name
View
5 tests/regressiontests/inspectdb/models.py
@@ -20,8 +20,11 @@ class DigitsInColumnName(models.Model):
leading_digit = models.CharField(max_length=11, db_column='4extra')
leading_digits = models.CharField(max_length=11, db_column='45extra')
-class UnderscoresInColumnName(models.Model):
+class SpecialColumnName(models.Model):
field = models.IntegerField(db_column='field')
+ # Underscores
field_field_0 = models.IntegerField(db_column='Field_')
field_field_1 = models.IntegerField(db_column='Field__')
field_field_2 = models.IntegerField(db_column='__field')
+ # Other chars
+ prc_x = models.IntegerField(db_column='prc(%) x')
View
7 tests/regressiontests/inspectdb/tests.py
@@ -59,8 +59,10 @@ def test_digits_column_name_introspection(self):
self.assertNotIn(" 45extra = models.CharField", output, msg=error_message)
self.assertIn("number_45extra = models.CharField", output)
- def test_underscores_column_name_introspection(self):
- """Introspection of column names containing underscores (#12460)"""
+ def test_special_column_name_introspection(self):
+ """Introspection of column names containing special characters,
+ unsuitable for Python identifiers
+ """
out = StringIO()
call_command('inspectdb', stdout=out)
output = out.getvalue()
@@ -68,3 +70,4 @@ def test_underscores_column_name_introspection(self):
self.assertIn("field_field = models.IntegerField(db_column='Field_')", output)
self.assertIn("field_field_0 = models.IntegerField(db_column='Field__')", output)
self.assertIn("field_field_1 = models.IntegerField(db_column='__field')", output)
+ self.assertIn("prc_x = models.IntegerField(db_column='prc(%) x')", output)
@caltrain

Shouldn't it be
if new_name.find('') >0:

instead of
if new_name.find('
') >= 0: ?
same goes for the following conditions. Please correct me if I am wrong. Thanks!

@ramiro

@mageshkhanna

From help(str.find) output: S.find(sub [,start [,end]]) -> int -- Return the lowest index in S where substring sub is found [...] Return -1 on failure.

So, the code is correct as it is.

Please sign in to comment.
Something went wrong with that request. Please try again.