dbm.html

来自「perl教程」· HTML 代码 · 共 390 行 · 第 1/4 页

HTML
390
字号
 <span class="variable">$dbh</span><span class="operator">-&gt;</span><span class="operator">{</span><span class="string">RaiseError</span><span class="operator">}</span> <span class="operator">=</span> <span class="number">1</span><span class="operator">;</span>
 <span class="keyword">for</span> <span class="keyword">my</span> <span class="variable">$sql</span><span class="operator">(</span> <span class="keyword">split</span> <span class="regex">/;\n+/</span><span class="operator">,</span><span class="string">"
     CREATE TABLE user ( user_name TEXT, phone TEXT );
     INSERT INTO user VALUES ('Fred Bloggs','233-7777');
     INSERT INTO user VALUES ('Sanjay Patel','777-3333');
     INSERT INTO user VALUES ('Junk','xxx-xxxx');
     DELETE FROM user WHERE user_name = 'Junk';
     UPDATE user SET phone = '999-4444' WHERE user_name = 'Sanjay Patel';
     SELECT * FROM user
 "</span><span class="operator">){</span>
     <span class="keyword">my</span> <span class="variable">$sth</span> <span class="operator">=</span> <span class="variable">$dbh</span><span class="operator">-&gt;</span><span class="variable">prepare</span><span class="operator">(</span><span class="variable">$sql</span><span class="operator">);</span>
     <span class="variable">$sth</span><span class="operator">-&gt;</span><span class="variable">execute</span><span class="operator">;</span>
     <span class="variable">$sth</span><span class="operator">-&gt;</span><span class="variable">dump_results</span> <span class="keyword">if</span> <span class="variable">$sth</span><span class="operator">-&gt;</span><span class="operator">{</span><span class="string">NUM_OF_FIELDS</span><span class="operator">}</span><span class="operator">;</span>
 <span class="operator">}</span>
 <span class="variable">$dbh</span><span class="operator">-&gt;</span><span class="variable">disconnect</span><span class="operator">;</span>
</pre>
<p>
</p>
<hr />
<h1><a name="usage">USAGE</a></h1>
<p>
</p>
<h2><a name="specifiying_files_and_directories">Specifiying Files and Directories</a></h2>
<p>DBD::DBM will automatically supply an appropriate file extension for the type of DBM you are using.  For example, if you use SDBM_File, a table called &quot;fruit&quot; will be stored in two files called &quot;fruit.pag&quot; and &quot;fruit.dir&quot;.  You should <em>never</em> specify the file extensions in your SQL statements.</p>
<p>However, I am not aware (and therefore DBD::DBM is not aware) of all possible extensions for various DBM types.  If your DBM type uses an extension other than .pag and .dir, you should set the <em>dbm_ext</em> attribute to the extension. <strong>And</strong> you should write me with the name of the implementation and extension so I can add it to DBD::DBM!  Thanks in advance for that :-).</p>
<pre>
    <span class="variable">$dbh</span> <span class="operator">=</span> <span class="variable">DBI</span><span class="operator">-&gt;</span><span class="keyword">connect</span><span class="operator">(</span><span class="string">'dbi:DBM:ext=.db'</span><span class="operator">);</span>  <span class="comment"># .db extension is used</span>
    <span class="variable">$dbh</span> <span class="operator">=</span> <span class="variable">DBI</span><span class="operator">-&gt;</span><span class="keyword">connect</span><span class="operator">(</span><span class="string">'dbi:DBM:ext='</span><span class="operator">);</span>     <span class="comment"># no extension is used</span>
</pre>
<p>or</p>
<pre>
    <span class="variable">$dbh</span><span class="operator">-&gt;</span><span class="operator">{</span><span class="string">dbm_ext</span><span class="operator">}</span><span class="operator">=</span><span class="string">'.db'</span><span class="operator">;</span>                      <span class="comment"># global setting</span>
    <span class="variable">$dbh</span><span class="operator">-&gt;</span><span class="operator">{</span><span class="string">dbm_tables</span><span class="operator">}</span><span class="operator">-&gt;</span><span class="operator">{</span><span class="string">'qux'</span><span class="operator">}</span><span class="operator">-&gt;</span><span class="operator">{</span><span class="string">ext</span><span class="operator">}</span><span class="operator">=</span><span class="string">'.db'</span><span class="operator">;</span>   <span class="comment"># setting for table 'qux'</span>
</pre>
<p>By default files are assumed to be in the current working directory.  To have the module look in a different directory, specify the <em>f_dir</em> attribute in either the connect string or by setting the database handle attribute.</p>
<p>For example, this will look for the file /foo/bar/fruit (or /foo/bar/fruit.pag for DBM types that use that extension)</p>
<pre>
   <span class="keyword">my</span> <span class="variable">$dbh</span> <span class="operator">=</span> <span class="variable">DBI</span><span class="operator">-&gt;</span><span class="keyword">connect</span><span class="operator">(</span><span class="string">'dbi:DBM:f_dir=/foo/bar'</span><span class="operator">);</span>
   <span class="keyword">my</span> <span class="variable">$ary</span> <span class="operator">=</span> <span class="variable">$dbh</span><span class="operator">-&gt;</span><span class="variable">selectall_arrayref</span><span class="operator">(</span><span class="string">q{ SELECT * FROM fruit }</span><span class="operator">);</span>
</pre>
<p>And this will too:</p>
<pre>
   <span class="keyword">my</span> <span class="variable">$dbh</span> <span class="operator">=</span> <span class="variable">DBI</span><span class="operator">-&gt;</span><span class="keyword">connect</span><span class="operator">(</span><span class="string">'dbi:DBM:'</span><span class="operator">);</span>
   <span class="variable">$dbh</span><span class="operator">-&gt;</span><span class="operator">{</span><span class="string">f_dir</span><span class="operator">}</span> <span class="operator">=</span> <span class="string">'/foo/bar'</span><span class="operator">;</span>
   <span class="keyword">my</span> <span class="variable">$ary</span> <span class="operator">=</span> <span class="variable">$dbh</span><span class="operator">-&gt;</span><span class="variable">selectall_arrayref</span><span class="operator">(</span><span class="string">q{ SELECT x FROM fruit }</span><span class="operator">);</span>
</pre>
<p>You can also use delimited identifiers to specify paths directly in SQL statements.  This looks in the same place as the two examples above but without setting <em>f_dir</em>:</p>
<pre>
   <span class="keyword">my</span> <span class="variable">$dbh</span> <span class="operator">=</span> <span class="variable">DBI</span><span class="operator">-&gt;</span><span class="keyword">connect</span><span class="operator">(</span><span class="string">'dbi:DBM:'</span><span class="operator">);</span>
   <span class="keyword">my</span> <span class="variable">$ary</span> <span class="operator">=</span> <span class="variable">$dbh</span><span class="operator">-&gt;</span><span class="variable">selectall_arrayref</span><span class="operator">(</span><span class="string">q{
       SELECT x FROM "/foo/bar/fruit"
   }</span><span class="operator">);</span>
</pre>
<p>If you have SQL::Statement installed, you can use table aliases:</p>
<pre>
   <span class="keyword">my</span> <span class="variable">$dbh</span> <span class="operator">=</span> <span class="variable">DBI</span><span class="operator">-&gt;</span><span class="keyword">connect</span><span class="operator">(</span><span class="string">'dbi:DBM:'</span><span class="operator">);</span>
   <span class="keyword">my</span> <span class="variable">$ary</span> <span class="operator">=</span> <span class="variable">$dbh</span><span class="operator">-&gt;</span><span class="variable">selectall_arrayref</span><span class="operator">(</span><span class="string">q{
       SELECT f.x FROM "/foo/bar/fruit" AS f
   }</span><span class="operator">);</span>
</pre>
<p>See the <a href="#gotchas_and_warnings">GOTCHAS AND WARNINGS</a> for using DROP on tables.</p>
<p>
</p>
<h2><a name="table_locking_and_flock__">Table locking and <a href="../../lib/Pod/perlfunc.html#item_flock"><code>flock()</code></a></a></h2>
<p>Table locking is accomplished using a lockfile which has the same name as the table's file but with the file extension '.lck' (or a lockfile extension that you suppy, see belwo).  This file is created along with the table during a CREATE and removed during a DROP.  Every time the table itself is opened, the lockfile is flocked().  For SELECT, this is an shared lock.  For all other operations, it is an exclusive lock.</p>
<p>Since the locking depends on flock(), it only works on operating systems that support flock().  In cases where <a href="../../lib/Pod/perlfunc.html#item_flock"><code>flock()</code></a> is not implemented, DBD::DBM will not complain, it will simply behave as if the <a href="../../lib/Pod/perlfunc.html#item_flock"><code>flock()</code></a> had occurred although no actual locking will happen.  Read the documentation for <a href="../../lib/Pod/perlfunc.html#item_flock"><code>flock()</code></a> if you need to understand this.</p>
<p>Even on those systems that do support flock(), the locking is only advisory - as is allways the case with flock().  This means that if some other program tries to access the table while DBD::DBM has the table locked, that other program will *succeed* at opening the table.  DBD::DBM's locking only applies to DBD::DBM.  An exception to this would be the situation in which you use a lockfile with the other program that has the same name as the lockfile used in DBD::DBM and that program also uses <a href="../../lib/Pod/perlfunc.html#item_flock"><code>flock()</code></a> on that lockfile.  In that case, DBD::DBM and your other program will respect each other's locks.</p>
<p>If you wish to use a lockfile extension other than '.lck', simply specify the dbm_lockfile attribute:</p>
<pre>
  <span class="variable">$dbh</span> <span class="operator">=</span> <span class="variable">DBI</span><span class="operator">-&gt;</span><span class="keyword">connect</span><span class="operator">(</span><span class="string">'dbi:DBM:lockfile=.foo'</span><span class="operator">);</span>
  <span class="variable">$dbh</span><span class="operator">-&gt;</span><span class="operator">{</span><span class="string">dbm_lockfile</span><span class="operator">}</span> <span class="operator">=</span> <span class="string">'.foo'</span><span class="operator">;</span>
  <span class="variable">$dbh</span><span class="operator">-&gt;</span><span class="operator">{</span><span class="string">dbm_tables</span><span class="operator">}</span><span class="operator">-&gt;</span><span class="operator">{</span><span class="string">qux</span><span class="operator">}</span><span class="operator">-&gt;</span><span class="operator">{</span><span class="string">lockfile</span><span class="operator">}</span> <span class="operator">=</span> <span class="string">'.foo'</span><span class="operator">;</span>
</pre>
<p>If you wish to disable locking, set the dbm_lockfile equal to 0.</p>
<pre>
  <span class="variable">$dbh</span> <span class="operator">=</span> <span class="variable">DBI</span><span class="operator">-&gt;</span><span class="keyword">connect</span><span class="operator">(</span><span class="string">'dbi:DBM:lockfile=0'</span><span class="operator">);</span>
  <span class="variable">$dbh</span><span class="operator">-&gt;</span><span class="operator">{</span><span class="string">dbm_lockfile</span><span class="operator">}</span> <span class="operator">=</span> <span class="number">0</span><span class="operator">;</span>
  <span class="variable">$dbh</span><span class="operator">-&gt;</span><span class="operator">{</span><span class="string">dbm_tables</span><span class="operator">}</span><span class="operator">-&gt;</span><span class="operator">{</span><span class="string">qux</span><span class="operator">}</span><span class="operator">-&gt;</span><span class="operator">{</span><span class="string">lockfile</span><span class="operator">}</span> <span class="operator">=</span> <span class="number">0</span><span class="operator">;</span>
</pre>
<p>
</p>
<h2><a name="specifying_the_dbm_type">Specifying the DBM type</a></h2>
<p>Each &quot;flavor&quot; of DBM stores its files in a different format and has different capabilities and different limitations.  See <a href="../../lib/AnyDBM_File.html">the AnyDBM_File manpage</a> for a comparison of DBM types.</p>
<p>By default, DBD::DBM uses the SDBM_File type of storage since SDBM_File comes with Perl itself.  But if you have other types of DBM storage available, you can use any of them with DBD::DBM also.</p>
<p>You can specify the DBM type using the &quot;dbm_type&quot; attribute which can be set in the connection string or with the $dbh-&gt;{dbm_type} attribute for global settings or with the $dbh-&gt;{dbm_tables}-&gt;{$table_name}-&gt;{type} attribute for per-table settings in cases where a single script is accessing more than one kind of DBM file.</p>
<p>In the connection string, just set type=TYPENAME where TYPENAME is any DBM type such as GDBM_File, DB_File, etc.  Do <em>not</em> use MLDBM as your dbm_type, that is set differently, see below.</p>
<pre>
 <span class="keyword">my</span> <span class="variable">$dbh</span><span class="operator">=</span><span class="variable">DBI</span><span class="operator">-&gt;</span><span class="keyword">connect</span><span class="operator">(</span><span class="string">'dbi:DBM:'</span><span class="operator">);</span>               <span class="comment"># uses the default SDBM_File</span>
 <span class="keyword">my</span> <span class="variable">$dbh</span><span class="operator">=</span><span class="variable">DBI</span><span class="operator">-&gt;</span><span class="keyword">connect</span><span class="operator">(</span><span class="string">'dbi:DBM:type=GDBM_File'</span><span class="operator">);</span> <span class="comment"># uses the GDBM_File</span>
</pre>
<p>You can also use $dbh-&gt;{dbm_type} to set global DBM type:</p>
<pre>
 <span class="variable">$dbh</span><span class="operator">-&gt;</span><span class="operator">{</span><span class="string">dbm_type</span><span class="operator">}</span> <span class="operator">=</span> <span class="string">'GDBM_File'</span><span class="operator">;</span>  <span class="comment"># set the global DBM type</span>
 <span class="keyword">print</span> <span class="variable">$dbh</span><span class="operator">-&gt;</span><span class="operator">{</span><span class="string">dbm_type</span><span class="operator">}</span><span class="operator">;</span>          <span class="comment"># display the global DBM type</span>
</pre>
<p>If you are going to have several tables in your script that come from different DBM types, you can use the $dbh-&gt;{dbm_tables} hash to store different settings for the various tables.  You can even use this to perform joins on files that have completely different storage mechanisms.</p>
<pre>
 <span class="keyword">my</span> <span class="variable">$dbh</span><span class="operator">-&gt;(</span><span class="string">'dbi:DBM:type=GDBM_File'</span><span class="operator">);</span>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?