diff options
| author | Shai Berger <shai@platonix.com> | 2014-01-29 19:18:32 +0200 |
|---|---|---|
| committer | Shai Berger <shai@platonix.com> | 2014-01-30 01:26:42 +0200 |
| commit | 5f42c0219550b62e62db6e0f3834671a994e3cd8 (patch) | |
| tree | 96909c00dc53d09a2f40e0d57c3ce8349ac55f45 | |
| parent | 0573120cb406066041b0235a3912dc38bc9f10ef (diff) | |
[1.6.x] Made Oracle introspect FloatFields correctly
Broke InspectDBTestCase.test_field_types in two:
- a test_number_field_types, which now passes on Oracle too
- a test_field_types, for all non-numeric fields, which is still expected to fail
Also made some pep8 fixes in the tests file. Refs #19884
Thanks Tim Graham for review.
Backport of e9d12ba from master
| -rw-r--r-- | django/db/backends/oracle/introspection.py | 23 | ||||
| -rw-r--r-- | tests/inspectdb/tests.py | 58 |
2 files changed, 48 insertions, 33 deletions
diff --git a/django/db/backends/oracle/introspection.py b/django/db/backends/oracle/introspection.py index 476e2f460b..3ea3a08572 100644 --- a/django/db/backends/oracle/introspection.py +++ b/django/db/backends/oracle/introspection.py @@ -30,16 +30,19 @@ class DatabaseIntrospection(BaseDatabaseIntrospection): def get_field_type(self, data_type, description): # If it's a NUMBER with scale == 0, consider it an IntegerField - if data_type == cx_Oracle.NUMBER and description[5] == 0: - if description[4] > 11: - return 'BigIntegerField' - elif description[4]==1: - return 'BooleanField' - else: - return 'IntegerField' - else: - return super(DatabaseIntrospection, self).get_field_type( - data_type, description) + if data_type == cx_Oracle.NUMBER: + precision, scale = description[4:6] + if scale == 0: + if precision > 11: + return 'BigIntegerField' + elif precision == 1: + return 'BooleanField' + else: + return 'IntegerField' + elif scale == -127: + return 'FloatField' + + return super(DatabaseIntrospection, self).get_field_type(data_type, description) def get_table_list(self, cursor): "Returns a list of table names in the current database." diff --git a/tests/inspectdb/tests.py b/tests/inspectdb/tests.py index 79cbbfa3f2..97e5d354a6 100644 --- a/tests/inspectdb/tests.py +++ b/tests/inspectdb/tests.py @@ -29,19 +29,49 @@ class InspectDBTestCase(TestCase): # inspected self.assertNotIn("class DjangoContentType(models.Model):", out.getvalue(), msg=error_message) - # Inspecting oracle DB doesn't produce correct results, see #19884 - @expectedFailureOnOracle - def test_field_types(self): - """Test introspection of various Django field types""" + def make_field_type_asserter(self): + """Call inspectdb and return a function to validate a field type in its output""" out = StringIO() call_command('inspectdb', - table_name_filter=lambda tn:tn.startswith('inspectdb_columntypes'), + table_name_filter=lambda tn: tn.startswith('inspectdb_columntypes'), stdout=out) output = out.getvalue() + def assertFieldType(name, definition): out_def = re.search(r'^\s*%s = (models.*)$' % name, output, re.MULTILINE).groups()[0] self.assertEqual(definition, out_def) + return assertFieldType + + # Inspecting oracle DB doesn't produce correct results, see #19884 + @expectedFailureOnOracle + def test_field_types(self): + """Test introspection of various Django field types""" + assertFieldType = self.make_field_type_asserter() + + assertFieldType('char_field', "models.CharField(max_length=10)") + assertFieldType('comma_separated_int_field', "models.CharField(max_length=99)") + assertFieldType('date_field', "models.DateField()") + assertFieldType('date_time_field', "models.DateTimeField()") + assertFieldType('email_field', "models.CharField(max_length=75)") + assertFieldType('file_field', "models.CharField(max_length=100)") + assertFieldType('file_path_field', "models.CharField(max_length=100)") + if connection.vendor == 'postgresql': + # Only PostgreSQL has a specific type + assertFieldType('ip_address_field', "models.GenericIPAddressField()") + assertFieldType('gen_ip_adress_field', "models.GenericIPAddressField()") + else: + assertFieldType('ip_address_field', "models.CharField(max_length=15)") + assertFieldType('gen_ip_adress_field', "models.CharField(max_length=39)") + assertFieldType('slug_field', "models.CharField(max_length=50)") + assertFieldType('text_field', "models.TextField()") + assertFieldType('time_field', "models.TimeField()") + assertFieldType('url_field', "models.CharField(max_length=200)") + + def test_number_field_types(self): + """Test introspection of various Django field types""" + assertFieldType = self.make_field_type_asserter() + assertFieldType('id', "models.IntegerField(primary_key=True)") assertFieldType('big_int_field', "models.BigIntegerField()") if connection.vendor == 'mysql': @@ -51,28 +81,14 @@ class InspectDBTestCase(TestCase): else: assertFieldType('bool_field', "models.BooleanField()") assertFieldType('null_bool_field', "models.NullBooleanField()") - assertFieldType('char_field', "models.CharField(max_length=10)") - assertFieldType('comma_separated_int_field', "models.CharField(max_length=99)") - assertFieldType('date_field', "models.DateField()") - assertFieldType('date_time_field', "models.DateTimeField()") if connection.vendor == 'sqlite': # Guessed arguments, see #5014 assertFieldType('decimal_field', "models.DecimalField(max_digits=10, decimal_places=5) " "# max_digits and decimal_places have been guessed, as this database handles decimal fields as float") else: assertFieldType('decimal_field', "models.DecimalField(max_digits=6, decimal_places=1)") - assertFieldType('email_field', "models.CharField(max_length=75)") - assertFieldType('file_field', "models.CharField(max_length=100)") - assertFieldType('file_path_field', "models.CharField(max_length=100)") assertFieldType('float_field', "models.FloatField()") assertFieldType('int_field', "models.IntegerField()") - if connection.vendor == 'postgresql': - # Only PostgreSQL has a specific type - assertFieldType('ip_address_field', "models.GenericIPAddressField()") - assertFieldType('gen_ip_adress_field', "models.GenericIPAddressField()") - else: - assertFieldType('ip_address_field', "models.CharField(max_length=15)") - assertFieldType('gen_ip_adress_field', "models.CharField(max_length=39)") if connection.vendor == 'sqlite': assertFieldType('pos_int_field', "models.PositiveIntegerField()") assertFieldType('pos_small_int_field', "models.PositiveSmallIntegerField()") @@ -83,14 +99,10 @@ class InspectDBTestCase(TestCase): assertFieldType('pos_small_int_field', "models.SmallIntegerField()") else: assertFieldType('pos_small_int_field', "models.IntegerField()") - assertFieldType('slug_field', "models.CharField(max_length=50)") if connection.vendor in ('sqlite', 'postgresql'): assertFieldType('small_int_field', "models.SmallIntegerField()") else: assertFieldType('small_int_field', "models.IntegerField()") - assertFieldType('text_field', "models.TextField()") - assertFieldType('time_field', "models.TimeField()") - assertFieldType('url_field', "models.CharField(max_length=200)") @skipUnlessDBFeature('can_introspect_foreign_keys') def test_attribute_name_not_python_keyword(self): |
