瀏覽代碼

Added a flag for the ability to introspect nullable fields.

Previously this was conflated with another Oracle-specific behavior.
Aymeric Augustin 10 年之前
父節點
當前提交
a03d38ddd4
共有 3 個文件被更改,包括 8 次插入5 次删除
  1. 3 0
      django/db/backends/__init__.py
  2. 1 0
      django/db/backends/oracle/base.py
  3. 4 5
      tests/introspection/tests.py

+ 3 - 0
django/db/backends/__init__.py

@@ -571,6 +571,9 @@ class BaseDatabaseFeatures(object):
     # Can the backend determine reliably the length of a CharField?
     can_introspect_max_length = True
 
+    # Can the backend determine reliably if a field is nullable?
+    can_introspect_null = True
+
     # Confirm support for introspected foreign keys
     # Every database can do this reliably, except MySQL,
     # which can't do it for MyISAM tables

+ 1 - 0
django/db/backends/oracle/base.py

@@ -112,6 +112,7 @@ class DatabaseFeatures(BaseDatabaseFeatures):
     supports_tablespaces = True
     supports_sequence_reset = False
     can_introspect_max_length = False
+    can_introspect_null = False
     can_introspect_time_field = False
     atomic_transactions = False
     supports_combined_alters = False

+ 4 - 5
tests/introspection/tests.py

@@ -1,7 +1,7 @@
 from __future__ import unicode_literals
 
 from django.db import connection
-from django.test import TestCase, skipUnlessDBFeature, skipIfDBFeature
+from django.test import TestCase, skipUnlessDBFeature
 
 from .models import Reporter, Article
 
@@ -73,10 +73,9 @@ class IntrospectionTests(TestCase):
             [30, 30, 75]
         )
 
-    # Oracle forces null=True under the hood in some cases (see
-    # https://docs.djangoproject.com/en/dev/ref/databases/#null-and-empty-strings)
-    # so its idea about null_ok in cursor.description is different from ours.
-    @skipIfDBFeature('interprets_empty_strings_as_nulls')
+    # The following test fails on Oracle. Since it forces null=True under the
+    # hood in some cases, its idea about null_ok is different from ours.
+    @skipUnlessDBFeature('can_introspect_null')
     def test_get_table_description_nullable(self):
         with connection.cursor() as cursor:
             desc = connection.introspection.get_table_description(cursor, Reporter._meta.db_table)