суббота, 9 апреля 2011 г.

Визуализатор схемы БД "на коленке"

Недавно мне потребовалось проверить соответствие существующей схемы БД (sqlite), тому , что должно быть согласно ТТ: все ли сущности есть в схеме, все ли отношения между ними указаны.

Потребовался способ быстро визуализировать имеющуюся схему, чтобы наглядно убедиться в наличии или отсутствии несоответствий.

Под рукой был python с установленным модулем sqlalchemy, а также вспомогательная python-овская библиотека для визуализации графов, средствами GraphViz.

Простейший скрипт на python:


#script: visualize.py
from sqlalchemy import MetaData
from sqlalchemy_schemadisplay import create_schema_graph
graph = create_schema_graph(metadata=MetaData('sqllite:///database.db'),
show_datatypes=False,
show_indexes=False,
rankdir='LR',
concentrate=False
)
graph.write_png('database.png')


и у меня перед глазами был png-файл , где вся схема была как на ладони.

Итак, еще раз ингридиенты:

1. python 2.5 (2.6,2.7) (aptitude install python)
2. sqlalchemy (easy_install sqlalchemy)
3. библиотека-GraphViz (aptitude install graphviz)
4. sqlalchemy_schemadisplay (wget http://pypi.python.org/packages/source/s/sqlalchemy_schemadisplay/sqlalchemy_schemadisplay-1.0.zip#md5=14b8366bb27b6abef32df65710d4380f )
5. visualize.py (см. код выше)
6. создаем произвольную директорию и кидаем туда п.5 и п.4, а также sqlite-базу)
7. запускаем: python visualize.py и получаем database.png

Все это хозяйство точно работает и с mysql (проверял лично) , а также должно теоретически работать почти со всеми известными СУБД (oracle, ms sql server, access db, postgres ...)

Если кому понадобится - пишите, выложу куда-нибудь архив-пример. Вот так , например, выглядит результат визуализации более менее сложной схемы (картинка размыта по просьбе правообладателя =)):



p.s. на этот раз ограничений с ОС нет. Все это работает и под Windows. Надо только скачать инсталлеры pythongraphviz-а с соответствующих офсайтов.

2 комментария:

  1. graph = create_schema_graph(metadata=MetaData('sqllite:///database.db'),

    В этой строке должно быть:
    ... 'sqlite:///...

    ОтветитьУдалить