/usr/share/perl5/DBIx/Simple/Examples.pod is in libdbix-simple-perl 1.37-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 | =head1 NAME
DBIx::Simple::Examples - Examples of how to use DBIx::Simple
=head1 DESCRIPTION
DBIx::Simple provides a simplified interface to DBI, Perl's powerful database
module.
=head1 EXAMPLES
=head2 General
#!/usr/bin/perl -w
use strict;
use DBIx::Simple;
# Instant database with DBD::SQLite
my $db = DBIx::Simple->connect('dbi:SQLite:dbname=file.dat')
or die DBIx::Simple->error;
# Connecting to a MySQL database
my $db = DBIx::Simple->connect(
'DBI:mysql:database=test', # DBI source specification
'test', 'test', # Username and password
{ RaiseError => 1 } # Additional options
);
# Using an existing database handle
my $db = DBIx::Simple->connect($dbh);
# Abstracted example: $db->query($query, @variables)->what_you_want;
$db->commit or die $db->error;
=head2 Simple Queries
$db->query('DELETE FROM foo WHERE id = ?', $id) or die $db->error;
for (1..100) {
$db->query(
'INSERT INTO randomvalues VALUES (?, ?)',
int rand(10),
int rand(10)
) or die $db->error;
}
$db->query(
'INSERT INTO sometable VALUES (??)',
$first, $second, $third, $fourth, $fifth, $sixth
);
# (??) is expanded to (?, ?, ?, ?, ?, ?) automatically
=head2 Single row queries
my ($two) = $db->query('SELECT 1 + 1')->list;
my ($three, $four) = $db->query('SELECT 3, 2 + 2')->list;
my ($name, $email) = $db->query(
'SELECT name, email FROM people WHERE email = ? LIMIT 1',
$mail
)->list;
Or, more efficiently:
$db->query('SELECT 1 + 1')->into(my $two);
$db->query('SELECT 3, 2 + 2')->into(my ($three, $four));
$db->query(
'SELECT name, email FROM people WHERE email = ? LIMIT 1',
$mail
)->into(my ($name, $email));
=head2 Fetching all rows in one go
=head3 One big flattened list (primarily for single column queries)
my @names = $db->query('SELECT name FROM people WHERE id > 5')->flat;
=head3 Rows as array references
for my $row ($db->query('SELECT name, email FROM people')->arrays) {
print "Name: $row->[0], Email: $row->[1]\n";
}
=head3 Rows as hash references
for my $row ($db->query('SELECT name, email FROM people')->hashes) {
print "Name: $row->{name}, Email: $row->{email}\n";
}
=head2 Fetching one row at a time
=head3 Rows into separate variables
{
my $result = $db->query('SELECT name, email FROM people');
$result->bind(my ($name, $email));
while ($result->fetch) {
print "Name: $name, Email: $email\n";
}
}
or:
{
my $result = $db->query('SELECT name, email FROM people');
while ($result->into(my ($name, $email))) {
print "Name: $name, Email: $email\n";
}
}
=head3 Rows as lists
{
my $result = $db->query('SELECT name, email FROM people');
while (my @row = $result->list) {
print "Name: $row[0], Email: $row[1]\n";
}
}
=head3 Rows as array references
{
my $result = $db->query('SELECT name, email FROM people');
while (my $row = $result->array) {
print "Name: $row->[0], Email: $row->[1]\n";
}
}
=head3 Rows as hash references
{
my $result = $db->query('SELECT name, email FROM people');
while (my $row = $result->hash) {
print "Name: $row->{name}, Email: $row->{email}\n";
}
}
=head2 Building maps (also fetching all rows in one go)
=head3 map
=head4 A hash of hashes
my $customers =
$db
-> query('SELECT id, name, location FROM people')
-> map_hashes('id');
# $customers = { $id => { name => $name, location => $location }, ... }
=head4 A hash of arrays
my $customers =
$db
-> query('SELECT id, name, location FROM people')
-> map_arrays(0);
# $customers = { $id => [ $name, $location ], ... }
=head4 A hash of values (two-column queries)
my $names =
$db
-> query('SELECT id, name FROM people')
-> map;
# $names = { $id => $name, ... }
=head3 group
=head4 A hash of arrays of hashes
my $customers =
$db
-> query('SELECT id, name, location FROM people')
-> group_hashes('location');
# $customers = { $location => [ { id => $id, name => $name }, ... ], ... }
=head4 A hash of arrays of arrays
my $customers =
$db
-> query('SELECT id, name, location FROM people')
-> group_arrays(2);
# $customers = { $location => [ [ $id, $name ], ... ], ... }
=head4 A hash of arrays of values (two-column queries)
my $names =
$db
-> query('SELECT location, name FROM people')
-> group;
# $names = { $location => [ $name, $name, ... ], ... }
=head1 EXAMPLES WITH SQL::Interp
If you have SQL::Interp installed, you can use the semi-abstracting method
C<iquery>. This works just like C<query>, but with parts of the query
interleaved with the bind arguments, passed as references.
You should read L<SQL::Interp>. These examples are not enough to fully
understand all the possibilities.
The following examples are based on the documentation of SQL::Interp.
my $result = $db->iquery('INSERT INTO table', \%item);
my $result = $db->iquery('UPDATE table SET', \%item, 'WHERE y <> ', \2);
my $result = $db->iquery('DELETE FROM table WHERE y = ', \2);
# These two select syntax produce the same result
my $result = $db->iquery('SELECT * FROM table WHERE x = ', \$s, 'AND y IN', \@v);
my $result = $db->iquery('SELECT * FROM table WHERE', {x => $s, y => \@v});
for ($result->hashes) { ... }
Use a syntax highlighting editor for good visual distinction.
If you need the helper functions C<sql> and C<sql_type>, you can import them
with C<use SQL::Interp;>
=head1 EXAMPLES WITH SQL::Abstract
If you have SQL::Abstract installed, you can use the abstracting methods
C<select>, C<insert>, C<update>, C<delete>. These work like C<query>, but
instead of a query and bind arguments, use abstracted arguments.
You should read L<SQL::Abstract>. These examples are not enough to fully
understand all the possibilities.
The SQL::Abstract object is available (writable) through the C<abstract>
property.
The following examples are based on the documentation of SQL::Abstract.
=head2 Overview
If you don't like the defaults, just assign a new object:
$db->abstract = SQL::Abstract->new(
case => 'lower',
cmp => 'like',
logic => 'and',
convert => 'upper'
);
If you don't assign any object, one will be created automatically using the
default options. The SQL::Abstract module is loaded on demand.
my $result = $db->select($table, \@fields, \%where, \@order);
my $result = $db->insert($table, \%fieldvals || \@values);
my $result = $db->update($table, \%fieldvals, \%where);
my $result = $db->delete($table, \%where);
for ($result->hashes) { ... }
=head2 Complete examples
=head3 select
my @tickets = $db->select(
'tickets', '*', {
requestor => 'inna',
worker => ['nwiger', 'rcwe', 'sfz'],
status => { '!=', 'completed' }
}
)->hashes;
=head3 insert
If you already have your data as a hash, inserting becomes much easier:
$db->insert('people', \%data);
Instead of:
$db->query(
q[
INSERT
INTO people (name, phone, address, ...)
VALUES (??)
],
@data{'name', 'phone', 'address', ... }
);
=head3 update, delete
$db->update(
'tickets', {
worker => 'juerd',
status => 'completed'
},
{ id => $id }
)
$db->delete('tickets', { id => $id });
=head3 where
The C<where> method is not wrapped directly, because it doesn't generate a
query and thus doesn't really have anything to do with the database module.
But using the C<abstract> property, you can still easily access it:
my $where = $db->abstract->where({ foo => $foo });
=head1 EXAMPLES WITH DBIx::XHTML_Table
If you have DBIx::XHTML_Table installed, you can use the result methods
C<xto> and C<html>.
You should read L<DBIx::XHTML_Table>. These examples are not enough to fully
understand what is going on. When reading that documentation, note that you
don't have to pass hash references to DBIx::Simple's methods. It is supported,
though.
DBIx::XHTML_Table is loaded on demand.
=head2 Overview
To print a simple table, all you have to do is:
print $db->query('SELECT * FROM foo')->html;
Of course, anything that produces a result object can be used. The same thing
using the abstraction method C<select> would be:
print $db->select('foo', '*')->html;
A DBIx::XHTML_Table object can be generated with the C<xto> (B<X>HTML_B<T>able
B<O>bject) method:
my $table = $db->query($query)->xto;
=head2 Passing attributes
DBIx::Simple sends the attributes you pass to C<html> both to the constructor
and the output method. This allows you to specify both HTML attributes (like
C<bgcolor>) and options for XHTML_Table (like C<no_ucfirst> and C<no_indent>)
all at once:
print $result->html(
tr => { bgcolor => [ qw/silver white/ ] },
no_ucfirst => 1
);
=head2 Using an XHTML_Table object
Not everything can be controlled by passing attributes. For full flexibility,
the XHTML_Table object can be used directly:
my $table = $db->query($query)->xto(
tr => { bgcolor => [ qw/silver white/ ] }
);
$table->set_group('client', 1);
$table->calc_totals('credit', '%.2f');
print $table->output({ no_ucfirst => 1 }); # note the {}!
=head1 EXAMPLES WITH Text::Table
=over 8
=item C<< $result->text("neat") >>
Neither neat nor pretty, but useful for debugging. Uses DBI's C<neat_list>
method. Doesn't display column names.
'1', 'Camel', 'mammal'
'2', 'Llama', 'mammal'
'3', 'Owl', 'bird'
'4', 'Juerd', undef
=item C<< $result->text("table") >>
Displays a simple table using ASCII lines.
id | animal | type
---+--------+-------
1 | Camel | mammal
2 | Llama | mammal
3 | Owl | bird
4 | Juerd |
=item C<< $result->text("box") >>
Displays a simple table using ASCII lines, with an outside border.
+----+--------+--------+
| id | animal | type |
+----+--------+--------+
| 1 | Camel | mammal |
| 2 | Llama | mammal |
| 3 | Owl | bird |
| 4 | Juerd | |
+----+--------+--------+
=back
For C<table> and C<box>, you need Anno Siegel's Text::Table module installed.
=head1 AUTHOR
Juerd Waalboer <juerd@cpan.org> <http://juerd.nl/>
=head1 SEE ALSO
L<DBIx::Simple>, L<SQL::Abstract>
=cut
|