~luisbg/djangodb2graph/trunk

« back to all changes in this revision

Viewing changes to dbschema2dot.py

  • Committer: Luis de Bethencourt
  • Date: 2009-01-20 14:48:52 UTC
  • Revision ID: luisbg@rorschach-20090120144852-8u52nuip3666hyfj
init

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Script to convert the models.py database schema to a dot file
 
2
# that graphviz will convert to a png graph.
 
3
 
 
4
# USAGE: after running this script run the command:
 
5
# $> dot -Tpng graph.dot -o graph.png
 
6
 
 
7
# The script runs twice through the models.py file.
 
8
# 1st iteration: Grab the classes and fields and translate to dot format
 
9
# 2nd iteration: Grab the links between tables and translate to dot format
 
10
 
 
11
# Any questions about the script or requests, please contact:
 
12
# Luis de Bethencourt <luis.debethencourt@sun.com>
 
13
 
 
14
import string
 
15
 
 
16
models = open("models.py", "r")
 
17
graph = open("graph.dot", "w")
 
18
graph.write('digraph structs {\n')
 
19
graph.write('    node [shape=record];\n')
 
20
new_line = ''
 
21
 
 
22
for line in models.readlines():
 
23
    if line.find('models.Model') != -1:
 
24
        if new_line != '':
 
25
            new_line = new_line + '"];\n'
 
26
#            print new_line
 
27
            graph.write(new_line + '\n')
 
28
        new_class = line.split()[1].split('(')[0]
 
29
        new_line = '    ' + new_class + ' [label="<0> ' + new_class
 
30
        c = 1
 
31
 
 
32
    if line.find('Field') != -1:
 
33
        new_line = new_line + ' | ' + line.split()[0]
 
34
 
 
35
    if line.find('ForeignKey') != -1:
 
36
        new_line = new_line + ' | <' + str(c) + '> ' + line.split()[0]
 
37
        c += 1
 
38
 
 
39
graph.write(new_line + '"];' + '\n')
 
40
 
 
41
graph.write('\n')
 
42
models.close()
 
43
models = open("models.py", "r")
 
44
 
 
45
for line in models.readlines():
 
46
    if line.find('models.Model') != -1:
 
47
        new_class = line.split()[1].split('(')[0]
 
48
        c = 1
 
49
    if line.find('ForeignKey') != -1:
 
50
        key = line.split()[2].split('(')[1][:-1]
 
51
        if key == "'self'":
 
52
           new_line = new_class + ':' + str(c) + '-> ' + new_class + ':0'
 
53
        else:
 
54
           new_line = new_class + ':' + str(c) + ' -> ' + key + ':0'
 
55
        print new_line
 
56
        graph.write('    ' + new_line + '\n')
 
57
        c += 1
 
58
 
 
59
graph.write('\n')
 
60
graph.write('    rankdir=LR\n')
 
61
graph.write('}')
 
62
 
 
63
models.close()
 
64
graph.close()