158
151
<div class="section" id="module-sqlalchemy.dialects.drizzle.base">
159
152
<span id="drizzle"></span><h1>Drizzle<a class="headerlink" href="#module-sqlalchemy.dialects.drizzle.base" title="Permalink to this headline">¶</a></h1>
160
153
<p>Support for the Drizzle database.</p>
161
<div class="section" id="supported-versions-and-features">
162
<h2>Supported Versions and Features<a class="headerlink" href="#supported-versions-and-features" title="Permalink to this headline">¶</a></h2>
163
<p>SQLAlchemy supports the Drizzle database starting with 2010.08.
164
with capabilities increasing with more modern servers.</p>
165
<p>Most available DBAPI drivers are supported; see below.</p>
166
<table border="1" class="docutils">
171
<thead valign="bottom">
172
<tr class="row-odd"><th class="head">Feature</th>
173
<th class="head">Minimum Version</th>
177
<tr class="row-even"><td>sqlalchemy.orm</td>
180
<tr class="row-odd"><td>Table Reflection</td>
183
<tr class="row-even"><td>DDL Generation</td>
186
<tr class="row-odd"><td>utf8/Full Unicode Connections</td>
189
<tr class="row-even"><td>Transactions</td>
192
<tr class="row-odd"><td>Two-Phase Transactions</td>
195
<tr class="row-even"><td>Nested Transactions</td>
200
<p>See the official Drizzle documentation for detailed information about features
201
supported in any given server release.</p>
154
<p>Drizzle is a variant of MySQL. Unlike MySQL, Drizzle’s default storage engine
155
is InnoDB (transactions, foreign-keys) rather than MyISAM. For more
156
<a class="reference external" href="http://docs.drizzle.org/mysql_differences.html">Notable Differences</a>, visit
157
the <a class="reference external" href="http://docs.drizzle.org/index.html">Drizzle Documentation</a>.</p>
158
<p>The SQLAlchemy Drizzle dialect leans heavily on the MySQL dialect, so much of
159
the <a class="reference internal" href="mysql.html"><em>SQLAlchemy MySQL</em></a> documentation is also relevant.</p>
203
160
<div class="section" id="connecting">
204
161
<h2>Connecting<a class="headerlink" href="#connecting" title="Permalink to this headline">¶</a></h2>
205
<p>See the API documentation on individual drivers for details on connecting.</p>
207
<div class="section" id="connection-timeouts">
208
<h2>Connection Timeouts<a class="headerlink" href="#connection-timeouts" title="Permalink to this headline">¶</a></h2>
209
<p>Drizzle features an automatic connection close behavior, for connections that
210
have been idle for eight hours or more. To circumvent having this issue, use
211
the <tt class="docutils literal"><span class="pre">pool_recycle</span></tt> option which controls the maximum age of any connection:</p>
212
<div class="highlight-python"><div class="highlight"><pre><span class="n">engine</span> <span class="o">=</span> <span class="n">create_engine</span><span class="p">(</span><span class="s">'drizzle+mysqldb://...'</span><span class="p">,</span> <span class="n">pool_recycle</span><span class="o">=</span><span class="mi">3600</span><span class="p">)</span></pre></div>
215
<div class="section" id="storage-engines">
216
<h2>Storage Engines<a class="headerlink" href="#storage-engines" title="Permalink to this headline">¶</a></h2>
217
<p>Drizzle defaults to the <tt class="docutils literal"><span class="pre">InnoDB</span></tt> storage engine, which is transactional.</p>
218
<p>Storage engines can be elected when creating tables in SQLAlchemy by supplying
219
a <tt class="docutils literal"><span class="pre">drizzle_engine='whatever'</span></tt> to the <tt class="docutils literal"><span class="pre">Table</span></tt> constructor. Any Drizzle table
220
creation option can be specified in this syntax:</p>
221
<div class="highlight-python"><div class="highlight"><pre><span class="n">Table</span><span class="p">(</span><span class="s">'mytable'</span><span class="p">,</span> <span class="n">metadata</span><span class="p">,</span>
222
<span class="n">Column</span><span class="p">(</span><span class="s">'data'</span><span class="p">,</span> <span class="n">String</span><span class="p">(</span><span class="mi">32</span><span class="p">)),</span>
223
<span class="n">drizzle_engine</span><span class="o">=</span><span class="s">'InnoDB'</span><span class="p">,</span>
224
<span class="p">)</span></pre></div>
227
<div class="section" id="keys">
228
<h2>Keys<a class="headerlink" href="#keys" title="Permalink to this headline">¶</a></h2>
229
<p>Not all Drizzle storage engines support foreign keys. For <tt class="docutils literal"><span class="pre">BlitzDB</span></tt> and
230
similar engines, the information loaded by table reflection will not include
231
foreign keys. For these tables, you may supply a
232
<tt class="xref py py-class docutils literal"><span class="pre">ForeignKeyConstraint</span></tt> at reflection time:</p>
233
<div class="highlight-python"><div class="highlight"><pre><span class="n">Table</span><span class="p">(</span><span class="s">'mytable'</span><span class="p">,</span> <span class="n">metadata</span><span class="p">,</span>
234
<span class="n">ForeignKeyConstraint</span><span class="p">([</span><span class="s">'other_id'</span><span class="p">],</span> <span class="p">[</span><span class="s">'othertable.other_id'</span><span class="p">]),</span>
235
<span class="n">autoload</span><span class="o">=</span><span class="bp">True</span>
236
<span class="p">)</span></pre></div>
238
<p>When creating tables, SQLAlchemy will automatically set <tt class="docutils literal"><span class="pre">AUTO_INCREMENT</span></tt> on
239
an integer primary key column:</p>
240
<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="n">t</span> <span class="o">=</span> <span class="n">Table</span><span class="p">(</span><span class="s">'mytable'</span><span class="p">,</span> <span class="n">metadata</span><span class="p">,</span>
241
<span class="gp">... </span> <span class="n">Column</span><span class="p">(</span><span class="s">'mytable_id'</span><span class="p">,</span> <span class="n">Integer</span><span class="p">,</span> <span class="n">primary_key</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
242
<span class="gp">... </span><span class="p">)</span>
243
<span class="gp">>>> </span><span class="n">t</span><span class="o">.</span><span class="n">create</span><span class="p">()</span>
244
<span class="go">CREATE TABLE mytable (</span>
245
<span class="go"> id INTEGER NOT NULL AUTO_INCREMENT,</span>
246
<span class="go"> PRIMARY KEY (id)</span>
247
<span class="go">)</span></pre></div>
249
<p>You can disable this behavior by supplying <tt class="docutils literal"><span class="pre">autoincrement=False</span></tt> to the
250
<tt class="xref py py-class docutils literal"><span class="pre">Column</span></tt>. This flag can also be used to enable
251
auto-increment on a secondary column in a multi-column key for some storage
253
<div class="highlight-python"><div class="highlight"><pre><span class="n">Table</span><span class="p">(</span><span class="s">'mytable'</span><span class="p">,</span> <span class="n">metadata</span><span class="p">,</span>
254
<span class="n">Column</span><span class="p">(</span><span class="s">'gid'</span><span class="p">,</span> <span class="n">Integer</span><span class="p">,</span> <span class="n">primary_key</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">autoincrement</span><span class="o">=</span><span class="bp">False</span><span class="p">),</span>
255
<span class="n">Column</span><span class="p">(</span><span class="s">'id'</span><span class="p">,</span> <span class="n">Integer</span><span class="p">,</span> <span class="n">primary_key</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
256
<span class="p">)</span></pre></div>
259
<div class="section" id="drizzle-sql-extensions">
260
<h2>Drizzle SQL Extensions<a class="headerlink" href="#drizzle-sql-extensions" title="Permalink to this headline">¶</a></h2>
261
<p>Many of the Drizzle SQL extensions are handled through SQLAlchemy’s generic
262
function and operator support:</p>
263
<div class="highlight-python"><div class="highlight"><pre><span class="n">table</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">table</span><span class="o">.</span><span class="n">c</span><span class="o">.</span><span class="n">password</span><span class="o">==</span><span class="n">func</span><span class="o">.</span><span class="n">md5</span><span class="p">(</span><span class="s">'plaintext'</span><span class="p">))</span>
264
<span class="n">table</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">table</span><span class="o">.</span><span class="n">c</span><span class="o">.</span><span class="n">username</span><span class="o">.</span><span class="n">op</span><span class="p">(</span><span class="s">'regexp'</span><span class="p">)(</span><span class="s">'^[a-d]'</span><span class="p">))</span></pre></div>
266
<p>And of course any valid Drizzle statement can be executed as a string as well.</p>
267
<p>Some limited direct support for Drizzle extensions to SQL is currently
270
<li><p class="first">SELECT pragma:</p>
271
<div class="highlight-python"><div class="highlight"><pre><span class="n">select</span><span class="p">(</span><span class="o">...</span><span class="p">,</span> <span class="n">prefixes</span><span class="o">=</span><span class="p">[</span><span class="s">'HIGH_PRIORITY'</span><span class="p">,</span> <span class="s">'SQL_SMALL_RESULT'</span><span class="p">])</span></pre></div>
274
<li><p class="first">UPDATE with LIMIT:</p>
275
<div class="highlight-python"><div class="highlight"><pre><span class="n">update</span><span class="p">(</span><span class="o">...</span><span class="p">,</span> <span class="n">drizzle_limit</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span></pre></div>
162
<p>See the individual driver sections below for details on connecting.</p>
280
164
<div class="section" id="drizzle-data-types">
281
165
<h2>Drizzle Data Types<a class="headerlink" href="#drizzle-data-types" title="Permalink to this headline">¶</a></h2>
613
498
<div class="section" id="module-sqlalchemy.dialects.drizzle.mysqldb">
614
499
<span id="mysql-python-notes"></span><h2>MySQL-Python Notes<a class="headerlink" href="#module-sqlalchemy.dialects.drizzle.mysqldb" title="Permalink to this headline">¶</a></h2>
615
<p>Support for the Drizzle database via the Drizzle-python adapter.</p>
616
<p>Drizzle-Python is available at:</p>
500
<p>Support for the Drizzle database via the mysql-python adapter.</p>
501
<p>MySQL-Python is available at:</p>
618
503
<div><a class="reference external" href="http://sourceforge.net/projects/mysql-python">http://sourceforge.net/projects/mysql-python</a></div></blockquote>
619
<p>At least version 1.2.1 or 1.2.2 should be used.</p>
620
504
<div class="section" id="id1">
621
505
<h3>Connecting<a class="headerlink" href="#id1" title="Permalink to this headline">¶</a></h3>
622
506
<p>Connect string format:</p>
623
507
<div class="highlight-python"><pre>drizzle+mysqldb://<user>:<password>@<host>[:<port>]/<dbname></pre>
626
<div class="section" id="unicode">
627
<h3>Unicode<a class="headerlink" href="#unicode" title="Permalink to this headline">¶</a></h3>
628
<p>Drizzle accommodates Python <tt class="docutils literal"><span class="pre">unicode</span></tt> objects directly and
629
uses the <tt class="docutils literal"><span class="pre">utf8</span></tt> encoding in all cases.</p>
631
<div class="section" id="known-issues">
632
<h3>Known Issues<a class="headerlink" href="#known-issues" title="Permalink to this headline">¶</a></h3>
633
<p>Drizzle-python at least as of version 1.2.2 has a serious memory leak related
634
to unicode conversion, a feature which is disabled via <tt class="docutils literal"><span class="pre">use_unicode=0</span></tt>.
635
The recommended connection form with SQLAlchemy is:</p>
636
<div class="highlight-python"><div class="highlight"><pre><span class="n">engine</span> <span class="o">=</span> <span class="n">create_engine</span><span class="p">(</span><span class="s">'mysql://scott:tiger@localhost/test?charset=utf8&use_unicode=0'</span><span class="p">,</span> <span class="n">pool_recycle</span><span class="o">=</span><span class="mi">3600</span><span class="p">)</span></pre></div>