mirror of
				https://github.com/django/django.git
				synced 2025-10-31 01:25:32 +00:00 
			
		
		
		
	Implemented get_indexes() for Postgres backend, which means 'inspectdb' can introspect primary keys and unique indexes for Postgres now.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@2349 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
		| @@ -127,7 +127,34 @@ def get_relations(cursor, table_name): | ||||
|     return relations | ||||
|  | ||||
| def get_indexes(cursor, table_name): | ||||
|     raise NotImplementedError | ||||
|     """ | ||||
|     Returns a dictionary of fieldname -> infodict for the given table, | ||||
|     where each infodict is in the format: | ||||
|         {'primary_key': boolean representing whether it's the primary key, | ||||
|          'unique': boolean representing whether it's a unique index} | ||||
|     """ | ||||
|     # Get the table description because we only have the column indexes, and we | ||||
|     # need the column names. | ||||
|     desc = get_table_description(cursor, table_name) | ||||
|     # This query retrieves each index on the given table. | ||||
|     cursor.execute(""" | ||||
|         SELECT idx.indkey, idx.indisunique, idx.indisprimary | ||||
|         FROM pg_catalog.pg_class c, pg_catalog.pg_class c2, | ||||
|             pg_catalog.pg_index idx | ||||
|         WHERE c.oid = idx.indrelid | ||||
|             AND idx.indexrelid = c2.oid | ||||
|             AND c.relname = %s""", [table_name]) | ||||
|     indexes = {} | ||||
|     for row in cursor.fetchall(): | ||||
|         # row[0] (idx.indkey) is stored in the DB as an array. It comes out as | ||||
|         # a string of space-separated integers. This designates the field | ||||
|         # indexes (1-based) of the fields that have indexes on the table. | ||||
|         # Here, we skip any indexes across multiple fields. | ||||
|         if ' ' in row[0]: | ||||
|             continue | ||||
|         col_name = desc[int(row[0])-1][0] | ||||
|         indexes[col_name] = {'primary_key': row[2], 'unique': row[1]} | ||||
|     return indexes | ||||
|  | ||||
| # Register these custom typecasts, because Django expects dates/times to be | ||||
| # in Python's native (standard-library) datetime/time format, whereas psycopg | ||||
|   | ||||
| @@ -117,7 +117,7 @@ models that refer to other models are ordered properly. | ||||
|  | ||||
| If you're using Django 0.90 or 0.91, you'll need to add ``primary_key=True`` to | ||||
| one field in each model. In the Django development version, primary keys are | ||||
| automatically introspected for MySQL, and Django puts in the | ||||
| automatically introspected for PostgreSQL and MySQL, and Django puts in the | ||||
| ``primary_key=True`` where needed. | ||||
|  | ||||
| ``inspectdb`` works with PostgreSQL, MySQL and SQLite. Foreign-key detection | ||||
|   | ||||
		Reference in New Issue
	
	Block a user