DEV Community

Mitch Jackson
Mitch Jackson Subscriber

Posted on

21 5

Auto-generate a Database Schema Diagram

Generate a Live Database Schema Diagram for your Catalyst Application

When building a web application, I always create a URL endpoint that generates a database schema diagram on the fly. This is a quick reference item that never gets old.

schema diagram

This approach can be used with any Perl web framework. The provided example is for the Catalyst Framework using a DBIx::Class ORM. This example provides the url http://mywebsite.com/dbdiagram


=head2 dbdiagram

Render an image representing the current data model

=cut

use SQL::Translator;
sub dbdiagram :Local :Args(0) {
    my ($self, $c) = @_;

    my $translator = SQL::Translator->new(
        parser => 'SQL::Translator::Parser::DBIx::Class',
        data   => $c->model('Ezn')->schema,
        producer => 'Diagram',
        producer_args => {
            output_type => 'png',
            title       => "My clever database diagram",
            add_color   => 1,
            font_size   => 'large',
        },
    ) or die SQL::Translator->error;

    $c->res->content_type('image/png');
    $c->res->body($translator->translate);
}

Don't Forget to restrict to authorized users!

See also:

Heroku

Deploy with ease. Manage efficiently. Scale faster.

Leave the infrastructure headaches to us, while you focus on pushing boundaries, realizing your vision, and making a lasting impression on your users.

Get Started

Top comments (6)

Collapse
 
fluffy profile image
fluffy

Oh wow, this is perfect! I recently started a job in which a primary role is maintaining and extending a rather large Catalyst app and I have never used Catalyst before. I'm also about ten years out-of-date on my Perl knowledge. So, every little bit helps. :)

Collapse
 
mjac profile image
Mitch Jackson

Congrats on the new job, thanks for letting me know this was helpful.

Collapse
 
exadra37 profile image
Paulo Renato • Edited

A production system should not have this endpoint at all. This is bad as a security practice and means that your automation as failed or does not exist at all.

Please if you really need it just expose it from the command line.

NOTE: having ssh access to a production system also means failure in you automation pipeline.

Collapse
 
mjac profile image
Mitch Jackson

You raise a good point: this feature is obviously to support development, not for production

Collapse
 
thorstenhirsch profile image
Thorsten Hirsch

What's :Local and :Args(0)?

Collapse
 
mjac profile image
Mitch Jackson

These function attributes are particular to the Catalyst MVC Framework.

You would include this function in a Catalyst::Controller package. In this case, you may choose YourApp::Controller::Debug as the controller name.

Catalyst will map this dbdiagram action to an application URL, as specified by these function attributes.

With :Local, this action URL part will be the function name, relative to the controller name. http://yourapp/debug/dbdiagram

A Catalyst action can receive function arguments as parts of the request URL. :Args(0) specifies this action will receive 0 arguments this way. This makes Pretty URL's easy. dbdiagram might accept a database name, and table name as arguments. This action would respond to the URL: http://yourapp/debug/dbdiagram/database_name/table_name.

sub dbdiagram :Local :Args(2) {
    my ($self, $c, $db_name, $table_name) = @_;

    # ...
}

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

👋 Kindness is contagious

Explore a trove of insights in this engaging article, celebrated within our welcoming DEV Community. Developers from every background are invited to join and enhance our shared wisdom.

A genuine "thank you" can truly uplift someone’s day. Feel free to express your gratitude in the comments below!

On DEV, our collective exchange of knowledge lightens the road ahead and strengthens our community bonds. Found something valuable here? A small thank you to the author can make a big difference.

Okay