Commit ffffdedf authored by Jacob Kaplan-Moss's avatar Jacob Kaplan-Moss
Browse files

Fixed #9991: correctly introspect PostgreSQL 'real' types.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@10379 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 374b02e3
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@ class DatabaseIntrospection(BaseDatabaseIntrospection):
        21: 'SmallIntegerField',
        23: 'IntegerField',
        25: 'TextField',
        700: 'FloatField',
        701: 'FloatField',
        869: 'IPAddressField',
        1043: 'CharField',
+22 −13
Original line number Diff line number Diff line
from django.conf import settings
from django.db import connection
from django.test import TestCase
from django.utils import functional
@@ -44,11 +45,11 @@ class IntrospectionTests(TestCase):
                     
    def test_django_table_names(self):
        cursor = connection.cursor()
        cursor.execute('CREATE TABLE django_introspection_testcase_table (id INTEGER);');
        cursor.execute('CREATE TABLE django_introspection_test_table (id INTEGER);');
        tl = connection.introspection.django_table_names()
        cursor.execute("DROP TABLE django_introspection_test_table;")
        self.assert_('django_introspection_testcase_table' not in tl,
                     "django_table_names() returned a non-Django table")
        cursor.execute("DROP TABLE django_introspection_testcase_table;")
                        
    def test_installed_models(self):
        tables = [Article._meta.db_table, Reporter._meta.db_table]
@@ -70,18 +71,18 @@ class IntrospectionTests(TestCase):
    def test_get_table_description_types(self):
        cursor = connection.cursor()            
        desc = connection.introspection.get_table_description(cursor, Reporter._meta.db_table)

        # Convert the datatype into a string
        def datatype(dbtype):
            dt = connection.introspection.data_types_reverse[dbtype]
            if type(dt) is tuple:
                return dt[0]
            else:
                return dt
            
        self.assertEqual([datatype(r[1]) for r in desc],
                          ['IntegerField', 'CharField', 'CharField', 'CharField'])

    # Regression test for #9991 - 'real' types in postgres
    if settings.DATABASE_ENGINE.startswith('postgresql'):
        def test_postgresql_real_type(self):
            cursor = connection.cursor()
            cursor.execute("CREATE TABLE django_introspection_real_test_table (number REAL);") 
            desc = connection.introspection.get_table_description(cursor, 'django_introspection_real_test_table')
            cursor.execute('DROP TABLE django_introspection_real_test_table;')
            self.assertEqual(datatype(desc[0][1]), 'FloatField')

    def test_get_relations(self):
        cursor = connection.cursor()
        relations = connection.introspection.get_relations(cursor, Article._meta.db_table)
@@ -97,3 +98,11 @@ class IntrospectionTests(TestCase):
        cursor = connection.cursor()
        indexes = connection.introspection.get_indexes(cursor, Article._meta.db_table)
        self.assertEqual(indexes['reporter_id'], {'unique': False, 'primary_key': False})
        
def datatype(dbtype):
    """Helper to convert a data type into a string."""
    dt = connection.introspection.data_types_reverse[dbtype]
    if type(dt) is tuple:
        return dt[0]
    else:
        return dt