diff --git a/AUTHORS b/AUTHORS index 77ed89d755..a59af03daa 100644 --- a/AUTHORS +++ b/AUTHORS @@ -74,6 +74,7 @@ answer newbie questions, and generally made Django that much better: David Schein sopel Radek Švarz + Swaroop C H Aaron Swartz Tom Tobin Joe Topjian diff --git a/django/core/db/__init__.py b/django/core/db/__init__.py index f0ffeebc2e..5883acefdd 100644 --- a/django/core/db/__init__.py +++ b/django/core/db/__init__.py @@ -35,6 +35,7 @@ get_date_trunc_sql = dbmod.get_date_trunc_sql get_limit_offset_sql = dbmod.get_limit_offset_sql get_random_function_sql = dbmod.get_random_function_sql get_table_list = dbmod.get_table_list +get_table_description = dbmod.get_table_description get_relations = dbmod.get_relations OPERATOR_MAPPING = dbmod.OPERATOR_MAPPING DATA_TYPES = dbmod.DATA_TYPES diff --git a/django/core/db/backends/ado_mssql.py b/django/core/db/backends/ado_mssql.py index be215ed7e9..bb5b628aca 100644 --- a/django/core/db/backends/ado_mssql.py +++ b/django/core/db/backends/ado_mssql.py @@ -112,6 +112,9 @@ def get_random_function_sql(): def get_table_list(cursor): raise NotImplementedError +def get_table_description(cursor, table_name): + raise NotImplementedError + def get_relations(cursor, table_name): raise NotImplementedError diff --git a/django/core/db/backends/mysql.py b/django/core/db/backends/mysql.py index 10379f9538..0e31af13fc 100644 --- a/django/core/db/backends/mysql.py +++ b/django/core/db/backends/mysql.py @@ -124,6 +124,11 @@ def get_table_list(cursor): cursor.execute("SHOW TABLES") return [row[0] for row in cursor.fetchall()] +def get_table_description(cursor, table_name): + "Returns a description of the table, with the DB-API cursor.description interface." + cursor.execute("SELECT * FROM %s LIMIT 1" % table_name) + return cursor.description + def get_relations(cursor, table_name): raise NotImplementedError diff --git a/django/core/db/backends/postgresql.py b/django/core/db/backends/postgresql.py index 487dd0da68..c650660ad8 100644 --- a/django/core/db/backends/postgresql.py +++ b/django/core/db/backends/postgresql.py @@ -100,6 +100,11 @@ def get_table_list(cursor): AND pg_catalog.pg_table_is_visible(c.oid)""") return [row[0] for row in cursor.fetchall()] +def get_table_description(cursor, table_name): + "Returns a description of the table, with the DB-API cursor.description interface." + cursor.execute("SELECT * FROM %s LIMIT 1" % table_name) + return cursor.description + def get_relations(cursor, table_name): """ Returns a dictionary of {field_index: (field_index_other_table, other_table)} diff --git a/django/core/db/backends/sqlite3.py b/django/core/db/backends/sqlite3.py index 930bb7c290..9133d08bba 100644 --- a/django/core/db/backends/sqlite3.py +++ b/django/core/db/backends/sqlite3.py @@ -124,7 +124,12 @@ def _sqlite_date_trunc(lookup_type, dt): return "%i-%02i-%02i 00:00:00" % (dt.year, dt.month, dt.day) def get_table_list(cursor): - raise NotImplementedError + cursor.execute("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name") + return [row[0] for row in cursor.fetchall()] + +def get_table_description(cursor, table_name): + cursor.execute("PRAGMA table_info(%s)" % table_name) + return [(row[1], row[2], None, None) for row in cursor.fetchall()] def get_relations(cursor, table_name): raise NotImplementedError diff --git a/django/core/management.py b/django/core/management.py index 4e6d0b4051..06c31abe13 100644 --- a/django/core/management.py +++ b/django/core/management.py @@ -571,8 +571,7 @@ def inspectdb(db_name): relations = db.get_relations(cursor, table_name) except NotImplementedError: relations = {} - cursor.execute("SELECT * FROM %s LIMIT 1" % table_name) - for i, row in enumerate(cursor.description): + for i, row in enumerate(db.get_table_description(cursor, table_name)): column_name = row[0] if relations.has_key(i): rel = relations[i] @@ -586,12 +585,16 @@ def inspectdb(db_name): field_type = db.DATA_TYPES_REVERSE[row[1]] except KeyError: field_type = 'TextField' - yield " # The model-creator script used TextField by default, because" - yield " # it couldn't recognize your field type." + field_type_was_guessed = True + else: + field_type_was_guessed = False field_desc = '%s = meta.%s(' % (column_name, field_type) if field_type == 'CharField': field_desc += 'maxlength=%s' % (row[3]) - yield ' %s)' % field_desc + field_desc += ')' + if field_type_was_guessed: + field_desc += ' # This is a guess!' + yield ' %s' % field_desc yield ' class META:' yield ' db_table = %r' % table_name yield '' diff --git a/docs/django-admin.txt b/docs/django-admin.txt index a8dff6defa..79cf4521ca 100644 --- a/docs/django-admin.txt +++ b/docs/django-admin.txt @@ -86,8 +86,9 @@ customizations. In particular, you'll need to do this: * Add ``primary_key=True`` to one field in each model. The ``inspectdb`` doesn't yet introspect primary keys. -``inspectdb`` only works with PostgreSQL and MySQL. Foreign-key detection only -works in PostgreSQL. +``inspectdb`` works with PostgreSQL, MySQL and SQLite. Foreign-key detection +only works in PostgreSQL. In SQLite, it cannot detect column types; it'll +use ``TextField`` for each column. install [modelmodule modelmodule ...] -------------------------------------