1Dancer::Plugin::DatabasUes:e:rCoCroen:t:rHiabnudtleedD(a3Pn)ecrelr:D:oPcluumgeinnt:a:tDiaotnabase::Core::Handle(3)
2
3
4
6 Dancer::Plugin::Database::Core::Handle - subclassed DBI connection
7 handle
8
10 Subclassed DBI connection handle with added convenience features
11
13 # in your Dancer app:
14 database->quick_insert($tablename, \%data);
15
16 # Updating a record where id = 42:
17 database->quick_update($tablename, { id => 42 }, { foo => 'New value' });
18
19 # Fetching a single row quickly in scalar context
20 my $employee = database->quick_select('employees', { id => $emp_id });
21
22 # Fetching multiple rows in list context - passing an empty hashref to signify
23 # no where clause (i.e. return all rows - so "select * from $table_name"):
24 my @all_employees = database->quick_select('employees', {});
25
26 # count number of male employees
27 my $count = database->quick_count('employees', { gender => 'male' });
28
30 A "Dancer::Plugin::Database::Handle" object is a subclassed DBI::db DBI
31 database handle, with the following added convenience methods:
32
33 quick_insert
34 database->quick_insert('mytable', { foo => 'Bar', baz => 5 });
35
36 Given a table name and a hashref of data (where keys are column
37 names, and the values are, well, the values), insert a row in the
38 table.
39
40 If you need any of the values to be interpolated straight into the
41 SQL, for instance if you need to use a function call like "NOW()"
42 or similar, then you can provide them as a scalarref:
43
44 database->quick_insert('mytable', { foo => 'Bar', timestamp => \'NOW()' });
45
46 Of course, if you do that, you must be careful to avoid SQL
47 injection attacks!
48
49 quick_update
50 database->quick_update('mytable', { id => 42 }, { foo => 'Baz' });
51
52 Given a table name, a hashref describing a where clause and a
53 hashref of changes, update a row.
54
55 As per quick_insert, if you need any of the values to be
56 interpolated straight in the SQL, for e.g. to use a function call,
57 provide a scalarref:
58
59 database->quick_update('mytable', { id => 42 }, { counter => \'counter + 1' });
60
61 Of course, if you do that, you must be careful to avoid SQL
62 injection attacks!
63
64 quick_delete
65 database->quick_delete($table, { id => 42 });
66
67 Given a table name and a hashref to describe the rows which should
68 be deleted (the where clause - see below for further details),
69 delete them.
70
71 quick_select
72 my $row = database->quick_select($table, { id => 42 });
73 my @rows = database->quick_select($table, { id => 42 });
74
75 Given a table name and a hashref of where clauses (see below for
76 explanation), and an optional hashref of options, returns either
77 the first matching row as a hashref if called in scalar context, or
78 a list of matching rows as hashrefs if called in list context. The
79 third argument is a hashref of options to allow additional control,
80 as documented below. For backwards compatibility, it can also be
81 an arrayref of column names, which acts in the same way as the
82 "columns" option.
83
84 The options you can provide are:
85
86 "columns"
87 An arrayref of column names to return, if you only want certain
88 columns returned
89
90 "order_by"
91 Specify how the results should be ordered. This option can
92 take various values:
93
94 • a straight scalar or arrayref sorts by the given column(s):
95
96 { order_by => 'foo' } # equivalent to "ORDER BY foo"
97 { order_by => [ qw(foo bar) ] } # equiv to "ORDER BY foo,bar"
98
99 • a hashref of "order =" column name>, e.g.:
100
101 { order_by => { desc => 'foo' } } # equiv to ORDER BY foo DESC
102 { order_by => [ { desc => 'foo' }, { asc => 'bar' } ] }
103 # above is equiv to ORDER BY foo DESC, bar ASC
104
105 "limit"
106 Limit how many records will be returned; equivalent to e.g.
107 "LIMIT 1" in an SQL query. If called in scalar context, an
108 implicit LIMIT 1 will be added to the query anyway, so you
109 needn't add it yourself.
110
111 An example of using options to control the results you get
112 back:
113
114 # Get the name & phone number of the 10 highest-paid men:
115 database->quick_select(
116 'employees',
117 { gender => 'male' },
118 { order_by => 'salary', limit => 10, columns => [qw(name phone)] }
119 );
120
121 "offset" number
122 "Offset" says to skip that many rows before beginning to return
123 rows (postgresql).
124
125 Example:
126
127 # Get the name & phone number of the 10 highest-paid men starting from 11th:
128 database->quick_select(
129 'employees',
130 { gender => 'male' },
131 { order_by => 'salary', offset => 10, limit => 10, columns => [qw(name phone)] }
132 );
133
134 quick_lookup
135 my $id = database->quick_lookup($table, { email => $params->{'email'} }, 'userid' );
136
137 This is a bit of syntactic sugar when you just want to lookup a
138 specific field, such as when you're converting an email address to
139 a userid (say during a login handler.)
140
141 This call always returns a single scalar value, not a hashref of
142 the entire row (or partial row) like most of the other methods in
143 this library.
144
145 Returns undef when there's no matching row or no such field found
146 in the results.
147
148 quick_count
149 my $count = database->quick_count($table,
150 { email => $params->{'email'} });
151
152 This is syntactic sugar to return a count of all rows which match
153 your parameters, useful for pagination.
154
155 This call always returns a single scalar value, not a hashref of
156 the entire row (or partial row) like most of the other methods in
157 this library.
158
159 All of the convenience methods provided take care to quote table and
160 column names using DBI's "quote_identifier", and use parameterised
161 queries to avoid SQL injection attacks. See
162 <http://www.bobby-tables.com/> for why this is important, if you're not
163 familiar with it.
164
166 "quick_update", "quick_delete" and "quick_select" take a hashref of
167 WHERE clauses. This is a hashref of field => 'value', each of which
168 will be included in the WHERE clause used, for instance:
169
170 { id => 42 }
171
172 Will result in an SQL query which would include:
173
174 WHERE id = 42
175
176 When more than one field => value pair is given, they will be ANDed
177 together:
178
179 { foo => 'Bar', bar => 'Baz' }
180
181 Will result in:
182
183 WHERE foo = 'Bar' AND bar = 'Baz'
184
185 (Actually, parameterised queries will be used, with placeholders, so
186 SQL injection attacks will not work, but it's easier to illustrate as
187 though the values were interpolated directly. Don't worry, they're
188 not.)
189
190 With the same idea in mind, you can check if a value is NULL with:
191
192 { foo => undef }
193
194 This will be correctly rewritten to "foo IS NULL".
195
196 You can pass an empty hashref if you want all rows, e.g.:
197
198 database->quick_select('mytable', {});
199
200 ... is the same as "SELECT * FROM 'mytable'"
201
202 If you pass in an arrayref as the value, you can get a set clause as in
203 the following example:
204
205 { foo => [ 'bar', 'baz', 'quux' ] }
206
207 ... it's the same as "WHERE foo IN ('bar', 'baz', 'quux')"
208
209 If you need additional flexibility, you can build fairly complex where
210 clauses by passing a hashref of condition operators and values as the
211 value to the column field key.
212
213 Currently recognized operators are:
214
215 'like'
216 { foo => { 'like' => '%bar%' } }
217
218 ... same as "WHERE foo LIKE '%bar%'"
219
220 'ilike'
221 Postgres-specific - same as 'like', but case-insensitive.
222
223 'gt' / 'ge'
224 'greater than' or 'greater or equal to'
225
226 { foo => { 'ge' => '42' } }
227
228 ... same as "WHERE foo >= '42'"
229
230 'lt' / 'le'
231 'less than' or 'less or equal to'
232
233 { foo => { 'lt' => '42' } }
234
235 ... same as "WHERE foo < '42'"
236
237 'eq' / 'ne' / 'is'
238 'equal' or 'not equal' or 'is'
239
240 { foo => { 'ne' => 'bar' } }
241
242 ... same as "WHERE foo != 'bar'"
243
244 You can also include a key named 'not' with a true value in the hashref
245 which will (attempt) to negate the other operator(s).
246
247 { foo => { 'like' => '%bar%', 'not' => 1 } }
248
249 ... same as "WHERE foo NOT LIKE '%bar%'"
250
251 If you use undef as the value for an operator hashref it will be
252 replaced with 'NULL' in the query.
253
254 If that's not flexible enough, you can pass in your own scalar WHERE
255 clause string BUT there's no automatic sanitation on that - if you
256 suffer from a SQL injection attack - don't blame me! Don't forget to
257 use "quote()"/"quote_identifier()" on it then.
258
260 David Precious " <<davidp@preshweb.co.uk "> >
261
263 See "ACKNOWLEDGEMENTS" in Dancer::Plugin::Database
264
266 Dancer::Plugin::Database and Dancer2::Plugin::Database
267
268 Dancer and Dancer2
269
270 DBI
271
273 Copyright 2016 David Precious.
274
275 This program is free software; you can redistribute it and/or modify it
276 under the terms of the the Artistic License (2.0). You may obtain a
277 copy of the full license at:
278
279 <http://www.perlfoundation.org/artistic_license_2_0>
280
281 Any use, modification, and distribution of the Standard or Modified
282 Versions is governed by this Artistic License. By using, modifying or
283 distributing the Package, you accept this license. Do not use, modify,
284 or distribute the Package, if you do not accept this license.
285
286 If your Modified Version has been derived from a Modified Version made
287 by someone other than you, you are nevertheless required to ensure that
288 your Modified Version complies with the requirements of this license.
289
290 This license does not grant you the right to use any trademark, service
291 mark, tradename, or logo of the Copyright Holder.
292
293 This license includes the non-exclusive, worldwide, free-of-charge
294 patent license to make, have made, use, er to sell, sell, import and
295 otherwise transfer the Package with respect to any patent claims
296 licensable by the Copyright Holder that are necessarily infringed by
297 the Package. If you institute patent litigation (including a cross-
298 claim or counterclaim) against any party alleging that the Package
299 constitutes direct or contributory patent infringement, then this
300 Artistic License to you shall terminate on the date that such
301 litigation is filed.
302
303 Disclaimer of Warranty: THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER
304 AND CONTRIBUTORS "AS IS' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES.
305 THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
306 PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY
307 YOUR LOCAL LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR
308 CONTRIBUTOR WILL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR
309 CONSEQUENTIAL DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE,
310 EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
311
312
313
314perl v5.32.1 2021D-a0n1c-e2r7::Plugin::Database::Core::Handle(3)