I think ... - dbmshttps://blog.kmonsoor.com/2014-12-18T00:00:00+06:00Generate ER diagram from a SQL-based database2014-12-18T00:00:00+06:002014-12-18T00:00:00+06:00Khaled Monsoortag:blog.kmonsoor.com,2014-12-18:/generate-er-diagram-from-sql-database/<p>When you are “study”-ing someone else’s database with 300+ tables. It’s like spaghetti, but not enjoyable. Rather, horrific.</p><p>When you are “study”-ing (for whatever reason) someone else’s database, and the database has more than 20 tables, you might be in trouble to understand what’s going where.</p>
<p>Now, imagine a database with 300+ tables. It’s like spaghetti, just not as enjoyable.</p>
<p>I faced a similar challenge recently with a database of 250+ tables. Yes, I felt like in a deep sh*t. And, I started looking for tools that can describe the tables, or at least a decent <span class="caps">ER</span> diagram. If anything more, better. And, preferably free.</p>
<p>Then, I found <a href="http://schemaspy.sourceforge.net/">SchemaSpy</a>, originally authored by <a href="https://sites.google.com/site/johncurrier/">John Currier</a>. It generates a complete in-depth <span class="caps">HTML</span>-based description (of course, including clickable <span class="caps">ER</span>-diagram) of the database, which you can then browse with your browser. This post is about its primary usage.</p>
<p>The output will be kind of like this:
<img alt="schemapy output sample" src="https://i.imgur.com/K1yYBID.png"></p>
<p>It is based on Java, but it can work its magic on most of the major database products. However, it would require an appropriate <span class="caps">JDBC</span> connector for that database.</p>
<p>Quote from the author:</p>
<blockquote>
<p><code>SchemaSpy</code> uses <span class="caps">JDBC</span>’s database metadata extraction services to gather the majority of its information but has to make vendor-specific <span class="caps">SQL</span> queries to gather some information such as the <span class="caps">SQL</span> associated with a view and the details of check constraints.</p>
</blockquote>
<p>In this post, as an example, I have shown how to use it with PostgreSQL. But, it’s not the only one that’s supported. You can use it with any proper <span class="caps">RDBMS</span> system as long as it has a <span class="caps">JDBC</span>-connector.
Now, to use it, you need to get these stuffs.</p>
<ul>
<li><strong>First of all</strong>, your system should have <strong>Java runtime</strong> properly installed. <a href="https://adoptopenjdk.net/">Download from here.</a></li>
<li><strong>SchemaSpy, which is a .jar file</strong>. <a href="https://sourceforge.net/projects/schemaspy/files/">Get it here</a>.
At the time of writing, it was version 5.0.0.</li>
<li><strong><span class="caps">JDBC</span> connector to PostgreSQL</strong>. Make sure to match your PostgreSQL version. You can <a href="https://jdbc.postgresql.org/download.html">download it from here</a>.<br>
You can check your PostgreSQL version by executing: <code>SELECT version();</code> query on <strong><em>psql</em></strong> prompt.</li>
<li>Also, SchemaSpy depends on <strong>GarphViz</strong> to generate the <span class="caps">ER</span> diagrams, so you need to be installed it on your system. Get it from here.(<a href="http://www.graphviz.org/Download..php">http://www.graphviz.org/Download..php</a>)</li>
<li>And, of course, make sure the target database instance is running <span class="amp">&</span> serving the database you are trying to visualize.</li>
</ul>
<p>Quoting from the author:</p>
<blockquote>
<p>SchemaSpy uses the dot executable from <a href="http://www.graphviz.org/">Graphviz</a> to generate graphical representations of the table/view relationships. The visual representation of the connections is a fundamental feature of the tool. </p>
<p>Graphviz is not required to view the output generated by SchemaSpy, but <strong>the dot program should be in your <span class="caps">PATH</span></strong> (not <span class="caps">CLASSPATH</span>) when running SchemaSpy, or none of the entity-relationship diagrams will be generated. Or, maybe <a href="http://schemaspy.sourceforge.net/#gvparam">use the <code>-gv</code></a> option).</p>
</blockquote>
<p>I kept the .jar files (both the <span class="caps">JDBC</span>-connector and the <code>SchemaSpy</code>) in my home folder for convenience.<br>
Now, in my case, my <span class="caps">OS</span> is Linux, and the database is hosted locally; hence address is <code>127.0.0.1</code>, running <code>PostgreSQL-9.3</code> at port <code>5432</code>.
So, I run the command like this:</p>
<div class="highlight"><pre><span></span><code><span class="linenos" data-linenos="1 "></span> $ java -jar ./schemaSpy_5.0.0.jar -t pgsql -host 127.0.0.1:5432 -db your_database_name \
<span class="linenos" data-linenos="2 "></span> -u your_DB_user_name -p your_password -s public \
<span class="linenos" data-linenos="3 "></span> -dp ./postgresql-9.3-1102.jdbc3.jar \
<span class="linenos" data-linenos="4 "></span> -o output_folder
</code></pre></div>
<p>It may take a little while, depending on the size of the schema of the database.<br>
After that, you will find the output folder/directory named <code>output_folder</code>.<br>
You’ll see some output when the magic is going on, similar to this below.</p>
<div class="highlight"><pre><span></span><code><span class="linenos" data-linenos="1 "></span>Using database properties: [./schemaSpy_5.0.0.jar]/net/sourceforge/schemaspy/dbTypes/pgsql.properties
<span class="linenos" data-linenos="2 "></span>Gathering schema details....................(6sec)
<span class="linenos" data-linenos="3 "></span>Writing/graphing summary....................(2sec)
<span class="linenos" data-linenos="4 "></span>Writing/diagramming detail..................(31sec)
<span class="linenos" data-linenos="5 "></span>Wrote relationship details of 113 tables/views to directory 'output' in 41 seconds.
<span class="linenos" data-linenos="6 "></span>
<span class="linenos" data-linenos="7 "></span>View the results by opening output_folder/index.html
</code></pre></div>
<p>Now, all the generated files are in the <code>output_folder</code>.
Start your journey by starting from the <code>index.html</code> in the output folder. Open it by using any browser.</p>
<p>Good luck. :)</p>
<hr>
<p>If you find this post helpful, you can show your support <a href="https://www.patreon.com/kmonsoor">through Patreon</a> or by <a href="https://ko-fi.com/kmonsoor">buying me a coffee</a>. <em>Thanks!</em></p>