From 27bb553ba0cf026a811a4c28adc7e97d6339f95c Mon Sep 17 00:00:00 2001 From: Jacob Kaplan-Moss Date: Thu, 2 Mar 2006 00:28:40 +0000 Subject: [PATCH] Added introspection.table_exists() method to db instrospection; this is used all over the place in django.db.management and will break under database backends that don't support LIMIT. git-svn-id: http://code.djangoproject.com/svn/django/branches/magic-removal@2461 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/db/backends/ado_mssql/introspection.py | 3 +++ django/db/backends/dummy/introspection.py | 1 + django/db/backends/mysql/introspection.py | 13 ++++++++++++- django/db/backends/postgresql/introspection.py | 11 +++++++++++ django/db/backends/sqlite3/introspection.py | 11 +++++++++++ 5 files changed, 38 insertions(+), 1 deletion(-) diff --git a/django/db/backends/ado_mssql/introspection.py b/django/db/backends/ado_mssql/introspection.py index b125cc995f..06755ac2ae 100644 --- a/django/db/backends/ado_mssql/introspection.py +++ b/django/db/backends/ado_mssql/introspection.py @@ -10,4 +10,7 @@ def get_relations(cursor, table_name): def get_indexes(cursor, table_name): raise NotImplementedError +def table_exists(cursor, table_name): + raise NotImplementedError + DATA_TYPES_REVERSE = {} diff --git a/django/db/backends/dummy/introspection.py b/django/db/backends/dummy/introspection.py index c52a812046..f8cc48b23b 100644 --- a/django/db/backends/dummy/introspection.py +++ b/django/db/backends/dummy/introspection.py @@ -4,5 +4,6 @@ get_table_list = complain get_table_description = complain get_relations = complain get_indexes = complain +table_exists = complain DATA_TYPES_REVERSE = {} diff --git a/django/db/backends/mysql/introspection.py b/django/db/backends/mysql/introspection.py index b4389e6030..c18f944d3d 100644 --- a/django/db/backends/mysql/introspection.py +++ b/django/db/backends/mysql/introspection.py @@ -1,3 +1,4 @@ +from django.db import transaction from django.db.backends.mysql.base import quote_name from MySQLdb.constants import FIELD_TYPE @@ -26,7 +27,17 @@ def get_indexes(cursor, table_name): for row in cursor.fetchall(): indexes[row[4]] = {'primary_key': (row[2] == 'PRIMARY'), 'unique': not bool(row[1])} return indexes - + +def table_exists(cursor, table_name): + """Returns True if the given table exists.""" + try: + cursor.execute("SELECT 1 FROM %s LIMIT 1" % quote_name(table_name)) + except: + transaction.rollback_unless_managed() + return False + else: + return True + DATA_TYPES_REVERSE = { FIELD_TYPE.BLOB: 'TextField', FIELD_TYPE.CHAR: 'CharField', diff --git a/django/db/backends/postgresql/introspection.py b/django/db/backends/postgresql/introspection.py index 63893bd15b..99d74e7f40 100644 --- a/django/db/backends/postgresql/introspection.py +++ b/django/db/backends/postgresql/introspection.py @@ -1,3 +1,4 @@ +from django.db import transaction from django.db.backends.postgresql.base import quote_name def get_table_list(cursor): @@ -66,6 +67,16 @@ def get_indexes(cursor, table_name): col_name = desc[int(row[0])-1][0] indexes[col_name] = {'primary_key': row[2], 'unique': row[1]} return indexes + +def table_exists(cursor, table_name): + """Returns True if the given table exists.""" + try: + cursor.execute("SELECT 1 FROM %s LIMIT 1" % quote_name(table_name)) + except: + transaction.rollback_unless_managed() + return False + else: + return True # Maps type codes to Django Field types. DATA_TYPES_REVERSE = { diff --git a/django/db/backends/sqlite3/introspection.py b/django/db/backends/sqlite3/introspection.py index 0ca971c0d4..413e4b958e 100644 --- a/django/db/backends/sqlite3/introspection.py +++ b/django/db/backends/sqlite3/introspection.py @@ -1,3 +1,4 @@ +from django.db import transaction from django.db.backends.sqlite3.base import quote_name def get_table_list(cursor): @@ -14,6 +15,16 @@ def get_relations(cursor, table_name): def get_indexes(cursor, table_name): raise NotImplementedError +def table_exists(cursor, table_name): + """Returns True if the given table exists.""" + try: + cursor.execute("SELECT 1 FROM %s LIMIT 1" % quote_name(table_name)) + except: + transaction.rollback_unless_managed() + return False + else: + return True + # Maps SQL types to Django Field types. Some of the SQL types have multiple # entries here because SQLite allows for anything and doesn't normalize the # field type; it uses whatever was given.