| 16 | | raise NotImplementedError |
|---|
| | 27 | """ |
|---|
| | 28 | Returns a dictionary of {field_index: (field_index_other_table, other_table)} |
|---|
| | 29 | representing all relationships to the given table. Indexes are 0-based. |
|---|
| | 30 | """ |
|---|
| | 31 | my_field_dict = _name_to_index(cursor, table_name) |
|---|
| | 32 | constraints = [] |
|---|
| | 33 | relations = {} |
|---|
| | 34 | try: |
|---|
| | 35 | # This should work for MySQL 5.0. |
|---|
| | 36 | cursor.execute(""" |
|---|
| | 37 | SELECT column_name, referenced_table_name, referenced_column_name |
|---|
| | 38 | FROM information_schema.key_column_usage |
|---|
| | 39 | WHERE table_name = %s |
|---|
| | 40 | AND referenced_table_name IS NOT NULL |
|---|
| | 41 | AND referenced_column_name IS NOT NULL""", [table_name]) |
|---|
| | 42 | constraints.extend(cursor.fetchall()) |
|---|
| | 43 | except (ProgrammingError, OperationalError): |
|---|
| | 44 | # Fall back to "SHOW CREATE TABLE", for previous MySQL versions. |
|---|
| | 45 | # Go through all constraints and save the equal matches. |
|---|
| | 46 | cursor.execute("SHOW CREATE TABLE %s" % table_name) |
|---|
| | 47 | for row in cursor.fetchall(): |
|---|
| | 48 | pos = 0 |
|---|
| | 49 | while True: |
|---|
| | 50 | match = foreign_key_re.search(row[1], pos) |
|---|
| | 51 | if match == None: |
|---|
| | 52 | break |
|---|
| | 53 | pos = match.end() |
|---|
| | 54 | constraints.append(match.groups()) |
|---|
| | 55 | |
|---|
| | 56 | for my_fieldname, other_table, other_field in constraints: |
|---|
| | 57 | other_field_index = _name_to_index(cursor, other_table)[other_field] |
|---|
| | 58 | my_field_index = my_field_dict[my_fieldname] |
|---|
| | 59 | relations[my_field_index] = (other_field_index, other_table) |
|---|
| | 60 | |
|---|
| | 61 | return relations |
|---|