diff options
| author | Adrian Holovaty <adrian@holovaty.com> | 2005-08-02 22:33:39 +0000 |
|---|---|---|
| committer | Adrian Holovaty <adrian@holovaty.com> | 2005-08-02 22:33:39 +0000 |
| commit | f4e4ae96cb69d616af6f7009512cdcd2cb7c1e39 (patch) | |
| tree | 718d7f7f37569d29868a4f46d7a68d9a40bde3d5 /django/core/db/backends | |
| parent | c0451036ac3823de742fecfc48234775e1cfd333 (diff) | |
Improved 'django-admin inspectdb' so that it detects ForeignKey relationships -- PostgreSQL only
git-svn-id: http://code.djangoproject.com/svn/django/trunk@395 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django/core/db/backends')
| -rw-r--r-- | django/core/db/backends/mysql.py | 3 | ||||
| -rw-r--r-- | django/core/db/backends/postgresql.py | 21 | ||||
| -rw-r--r-- | django/core/db/backends/sqlite3.py | 3 |
3 files changed, 27 insertions, 0 deletions
diff --git a/django/core/db/backends/mysql.py b/django/core/db/backends/mysql.py index aa99516209..886a0a38b8 100644 --- a/django/core/db/backends/mysql.py +++ b/django/core/db/backends/mysql.py @@ -73,6 +73,9 @@ def get_table_list(cursor): cursor.execute("SHOW TABLES") return [row[0] for row in cursor.fetchall()] +def get_relations(cursor, table_name): + raise NotImplementedError + OPERATOR_MAPPING = { 'exact': '=', 'iexact': 'LIKE', diff --git a/django/core/db/backends/postgresql.py b/django/core/db/backends/postgresql.py index cd8d9a064e..94a6ed35c3 100644 --- a/django/core/db/backends/postgresql.py +++ b/django/core/db/backends/postgresql.py @@ -82,6 +82,27 @@ def get_table_list(cursor): AND pg_catalog.pg_table_is_visible(c.oid)""") return [row[0] for row in cursor.fetchall()] +def get_relations(cursor, table_name): + """ + Returns a dictionary of {field_index: (field_index_other_table, other_table)} + representing all relationships to the given table. Indexes are 0-based. + """ + cursor.execute(""" + SELECT con.conkey, con.confkey, c2.relname + FROM pg_constraint con, pg_class c1, pg_class c2 + WHERE c1.oid = con.conrelid + AND c2.oid = con.confrelid + AND c1.relname = %s + AND con.contype = 'f'""", [table_name]) + relations = {} + for row in cursor.fetchall(): + try: + # row[0] and row[1] are like "{2}", so strip the curly braces. + relations[int(row[0][1:-1]) - 1] = (int(row[1][1:-1]) - 1, row[2]) + except ValueError: + continue + return relations + # Register these custom typecasts, because Django expects dates/times to be # in Python's native (standard-library) datetime/time format, whereas psycopg # use mx.DateTime by default. diff --git a/django/core/db/backends/sqlite3.py b/django/core/db/backends/sqlite3.py index b719b8f8cd..38ce767dfb 100644 --- a/django/core/db/backends/sqlite3.py +++ b/django/core/db/backends/sqlite3.py @@ -112,6 +112,9 @@ def _sqlite_date_trunc(lookup_type, dt): def get_table_list(cursor): raise NotImplementedError +def get_relations(cursor, table_name): + raise NotImplementedError + # Operators and fields ######################################################## OPERATOR_MAPPING = { |
