Getting MySQL metadata with Perl
Metadata is information about the data in the database. Metadata in MySQL contains information about the tables and columns, in which we store data. Number of rows affected by an SQL statement is a metadata. Number of rows and columns returned in a result set belong to metadata as well.
Method name | Description |
---|---|
column_info() |
Provides information about columns |
table_info() |
Provides information about tables |
primary_key_info() |
Provides information about primary keys in tables |
foreign_key_info() |
Provides information about foreign keys in tables |
The above table lists four Perl DBI methods, which are used to retrieve metadata.
#!/usr/bin/perl use strict; use DBI; my $dbh = DBI->connect( "dbi:mysql:dbname=mydb", "user12", "34klq*", { RaiseError => 1 }, ) or die $DBI::errstr; my $sth = $dbh->primary_key_info(undef, "mydb", "Cars"); my @ary = $sth->fetchrow_array(); print join(" ", @ary), "\n"; $sth->finish(); $dbh->disconnect();
In the first example, we will find out information about a primary key in the Cars
table.
my $sth = $dbh->primary_key_info(undef, "main", "Cars");
The primary_key_info()
returns an active statement handle that can be used to fetch information about columns that make up the primary key for a table.
my @ary = $sth->fetchrow_array();
From the statement handle, we retrieve the information.
$ ./pk_info.pl mydb Cars Id 1 PRIMARY
From the output we can see that there is a primary key in the Cars
table. The primary key is the first column, named Id.
Next we will print all rows from the Cars
table with their column names.
#!/usr/bin/perl use strict; use DBI; my $dbh = DBI->connect( "dbi:mysql:dbname=mydb", "user12", "34klq*", { RaiseError => 1 }, ) or die $DBI::errstr; my $sth = $dbh->prepare( "SELECT * FROM Cars LIMIT 8" ); $sth->execute(); my $headers = $sth->{NAME}; my ($id, $name, $price) = @$headers; printf "%s %-10s %s\n", $id, $name, $price; my $row; while($row = $sth->fetchrow_hashref()) { printf "%2d %-10s %d\n", $row->{Id}, $row->{Name}, $row->{Price}; } $sth->finish(); $dbh->disconnect();
We print the contents of the Cars
table to the console. Now, we include the names of the columns too. The records are aligned with the column names.
my $headers = $sth->{NAME};
We get the column names from the statement object.
my ($id, $name, $price) = @$headers; printf "%s %-10s %s\n", $id, $name, $price;
The column names are printed to the console. We apply some formatting with the printf
function.
my $row; while($row = $sth->fetchrow_hashref()) { printf "%2d %-10s %d\n", $row->{Id}, $row->{Name}, $row->{Price}; }
The data is retrieved, formatted, and printed to the terminal.
$ ./column_names.pl Id Name Price 1 Audi 52642 2 Mercedes 57127 3 Skoda 9000 4 Volvo 29000 5 Bentley 350000 6 Citroen 21000 7 Hummer 41400 8 Volkswagen 21601
Output of the column_names.pl
script.
In our last example related to metadata, we will list all tables in the test.db
database.
#!/usr/bin/perl use strict; use DBI; my $dbh = DBI->connect( "dbi:mysql:dbname=mydb", "user12", "34klq*", { RaiseError => 1 }, ) or die $DBI::errstr; my @tables = $dbh->tables(); foreach my $table ( @tables ) { print "Table: $table\n"; } $dbh->disconnect();
The code example prints all available tables in the current database to the terminal.
my @tables = $dbh->tables();
The table names are retrieved with the tables()
method.
$ ./list_tables.pl Table: `mydb`.`Cars` Table: `mydb`.`Friends` Table: `mydb`.`Images`
These were the tables on our system.
In this part of the MySQL Perl tutorial, we have worked with database metadata.