On Mar 22, 2010, at 9:06 AM, Kent wrote: > I have a need to pass around session-dependent application data, such > as strong references to certain objects that I don't want garbage > collected so they will serve as a cache for the duration of the > session. For example, if the application performs a get() on a > "SystemParameters" table, I want a strong reference to that object for > the duration of the session so that subsequent get()s do not reference > the database. > > Further, I don't wish to pass such a variable all over through-out my > session to all function calls, etc. > > I was considering adding an attribute to the (scoped) session for this > purpose at run time (I wish to avoid modifying the thirdparty > source). Something that will automatically be torn down when the > (scoped) session is. > > Can you recommend an approach or better idea?
subclass Query and setup caching options. There's examples in the 0.6 distro that use Beaker including one that assigns the cache to be local to the Session, but attached is a simpler version from my pycon tutorial that doesn't have any dependencies.
> > Thanks very much again. > > -- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]. > For more options, visit this group at > http://groups.google.com/group/sqlalchemy?hl=en. >
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <title> zzzeek / pycon2010 / source — bitbucket.org </title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="description" content="Mercurial hosting - we're here to serve." /> <meta name="keywords" content="mercurial,hg,hosting,bitbucket,zzzeek,source,sourcecode,chap5/query_subclass...@191eb2c45a3a" /> <link rel="stylesheet" type="text/css" href="http://bitbucket-assets.s3.amazonaws.com/css/layout.css" /> <meta name="google-site-verification" content="GLJMpoIUjgWhrjaR6XRvBOZqe-JbiFVzUhs5iOJ1iI8" /> <link rel="stylesheet" type="text/css" href="http://bitbucket-assets.s3.amazonaws.com/css/screen.css" /> <link rel="stylesheet" type="text/css" href="http://bitbucket-assets.s3.amazonaws.com/css/print.css" media="print" /> <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="Bitbucket" /> <link rel="icon" href="http://bitbucket-assets.s3.amazonaws.com/img/logo_new.png" type="image/png"/> <script type="text/javascript" src="http://bitbucket-assets.s3.amazonaws.com/js/lib/bundle.160310Mar.js"></script> <script type="text/javascript"> $(document).ready(function() { Dropdown.init(); $(".tooltip").tipsy({gravity:'s'}); }); </script> <noscript> <style type="text/css"> .dropdown-container-text .dropdown { position: static !important; } </style> </noscript> <!--[if lt IE 7]> <style type="text/css"> body { behavior: url(http://bitbucket-assets.s3.amazonaws.com/css/csshover.htc); } #issues-issue pre { white-space: normal !important; } .changeset-description { white-space: normal !important; } </style> <script type="text/javascript"> $(document).ready(function(){ $('#header-wrapper').pngFix(); $('#sourcelist').pngFix(); $('.promo-signup-screenshot').pngFix(); }); </script> <![endif]--> <link rel="stylesheet" href="http://bitbucket-assets.s3.amazonaws.com/css/highlight/trac.css" type="text/css" /> <script type="text/javascript"> var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-2456069-3'], ['_trackPageview']); (function() { var ga = document.createElement('script'); ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; ga.setAttribute('async', 'true'); document.documentElement.firstChild.appendChild(ga); })(); </script> </head> <body class=""> <div id="main-wrapper"> <div id="header-wrapper"> <div id="header"> <a href="/"><img src="http://bitbucket-assets.s3.amazonaws.com/img/logo_myriad.png" alt="Bitbucket" id="header-wrapper-logo" /></a> <div id="header-nav"> <div id="header-nav-login-forms"> <form action="/account/signin/" method="post"> <fieldset> <input id="id_username_header" type="text" class="required login" name="username" value="username" maxlength="30" onfocus="if(this.value=='username'){this.value='';}; $(this).addClass('normaltext');" /> <input id="id_password_header" type="password" class="required login" name="password" value="password" maxlength="128" onfocus="if(this.value=='password'){this.value='';}; $(this).addClass('normaltext');" /> <input type="submit" name="blogin" value="»" style="display:none;" /> <input type="hidden" name="next" value="/zzzeek/pycon2010/src/tip/chap5/query_subclass.py"/> </fieldset> </form> <form name="fopenid" action="/account/signin/" method="post"> <fieldset> <input id="id_openid_url" type="text" class="required openid" name="openid_url" maxlength="255" value="your OpenID URL" onfocus="if(this.value=='your OpenID URL'){this.value='';}; $(this).addClass('normaltext');" /> <input name="bsignin" type="submit" value="»" style="display: none;" /> <input type="hidden" name="next" value="/zzzeek/pycon2010/src/tip/chap5/query_subclass.py" /> </fieldset> </form> </div> <ul class="right"> <li><a href="/">Home</a></li> <li><a href="/plans/"><b>Plans & Signup</b></a></li> <li><a href="/repo/all/">Repositories</a></li> <li><a href="/news/">News</a></li> <li><a href="/help/">Help</a></li> <li><a href="/account/signin/">Login</a></li> </ul> </div> </div> </div> <div id="content-wrapper"> <script type="text/javascript" src="http://bitbucket-assets.s3.amazonaws.com/js/lib/jquery.cookie.js"></script> <!--REMOVE WHEN NEWER BUNDLE THAN 030309Mar --> <script type="text/javascript"> var date = new Date(); date.setTime(date.getTime() + (365 * 24 * 60 * 60 * 1000)); var cookieoptions = { path: '/', expires: date }; window._shard = 'fe01 (ID 1)'; $(document).ready(function(){ $('#toggle-repo-content').click(function(){ $('#repo-desc-cloneinfo').toggle('fast'); $('#repo-menu').toggle(); $('#repo-menu-links-mini').toggle(100); $('.repo-desc-description').toggle('fast'); var avatar_new_width = ($('.repo-avatar').width() == 35) ? 16 : 35; $('.repo-avatar').animate({ width: avatar_new_width }, 250); if ($.cookie('toggle_status') == 'hide') { $.cookie('toggle_status', 'show', cookieoptions); $(this).css('background-image','url(http://bitbucket-assets.s3.amazonaws.com/img/repo-toggle-up.png)'); } else { $.cookie('toggle_status', 'hide', cookieoptions); $(this).css('background-image','url(http://bitbucket-assets.s3.amazonaws.com/img/repo-toggle-down.png)'); } }); if ($.cookie('toggle_status') == 'hide') { $('#toggle-repo-content').css('background-image','url(http://bitbucket-assets.s3.amazonaws.com/img/repo-toggle-down.png)'); $('#repo-desc-cloneinfo').hide(); $('#repo-menu').hide(); $('#repo-menu-links-mini').show(); $('.repo-desc-description').hide(); $('.repo-avatar').css({ width: '16px' }); } else { $('#toggle-repo-content').css('background-image','url(http://bitbucket-assets.s3.amazonaws.com/img/repo-toggle-up.png)'); $('#repo-desc-cloneinfo').show(); $('#repo-menu').show(); $('#repo-menu-links-mini').hide(); $('.repo-desc-description').show(); $('.repo-avatar').css({ width: '35px' }); } }); </script> <div id="tabs"> <ul class="ui-tabs-nav"> <li> <a href="/zzzeek/pycon2010/overview/"><span>Overview</span></a> </li> <li> <a href="/zzzeek/pycon2010/downloads/"><span>Downloads (0)</span></a> </li> <li class="ui-tabs-selected"> <a href="/zzzeek/pycon2010/src/191eb2c45a3a/"><span>Source</span></a> </li> <li> <a href="/zzzeek/pycon2010/changesets/"><span>Changesets</span></a> </li> <li class="ui-tabs-nav-issues"> <a href="/zzzeek/pycon2010/wiki/"><span>Wiki</span></a> </li> <li class="ui-tabs-nav-issues"> <a href="/zzzeek/pycon2010/issues/?status=new&status=open"><span>Issues (0) »</span></a> <ul> <li><a href="/zzzeek/pycon2010/issues/?status=new">New issues</a></li> <li><a href="/zzzeek/pycon2010/issues/?status=new&status=open">Open issues</a></li> <li><a href="/zzzeek/pycon2010/issues/?status=resolved&status=invalid&status=duplicate">Closed issues</a></li> <li><a href="/zzzeek/pycon2010/issues/">All issues</a></li> <li><a href="/zzzeek/pycon2010/issues/query/">Advanced query</a></li> <li><a href="/zzzeek/pycon2010/issues/new/">Create new issue</a></li> </ul> </li> <li class="tabs-right tabs-far-right"> <a href="/zzzeek/pycon2010/descendants/"><span>Forks/Queues (1)</span></a> </li> <li class="tabs-right"> <a href="/zzzeek/pycon2010/zealots/"><span>Followers (1)</span></a> </li> </ul> </div> <div id="repo-menu"> <div id="repo-menu-links"> <ul> <li> <a href="/zzzeek/pycon2010/rss/" class="noborder repo-menu-rss" title="RSS Feed for pycon2010">RSS</a> </li> <li> <a href="/zzzeek/pycon2010/atom/" class="noborder repo-menu-atom" title="Atom Feed for pycon2010">Atom</a> </li> <li> <a href="/zzzeek/pycon2010/pull/" class="link-request-pull"> pull request </a> </li> <li><a href="/zzzeek/pycon2010/fork/" class="link-fork">fork</a></li> <li><a href="/zzzeek/pycon2010/hack/" class="link-hack">patch queue</a></li> <li> <a rel="nofollow" href="/zzzeek/pycon2010/follow/" class="link-follow">follow</a> </li> <li><a class="link-download">get source »</a> <ul> <li><a rel="nofollow" href="/zzzeek/pycon2010/get/191eb2c45a3a.zip" class="zip">zip</a></li> <li><a rel="nofollow" href="/zzzeek/pycon2010/get/191eb2c45a3a.gz" class="compressed">gz</a></li> <li><a rel="nofollow" href="/zzzeek/pycon2010/get/191eb2c45a3a.bz2" class="compressed">bz2</a></li> </ul> </li> </ul> </div> <div id="repo-menu-branches-tags"> <ul> <li class="icon-branches"> branches » <ul> <li><a href="/zzzeek/pycon2010/src/191eb2c45a3a/">default</a></li> </ul> </li> <li class="icon-tags"> tags » <ul> <li><a href="/zzzeek/pycon2010/src/191eb2c45a3a/">tip</a></li> </ul> </li> </ul> </div> <div class="cb"></div> </div> <div id="repo-desc" class="layout-box"> <div id="repo-menu-links-mini" class="right"> <ul> <li> <a href="/zzzeek/pycon2010/rss/" class="noborder repo-menu-rss" title="RSS Feed for pycon2010"></a> </li> <li> <a href="/zzzeek/pycon2010/atom/" class="noborder repo-menu-atom" title="Atom Feed for pycon2010"></a> </li> <li> <a href="/zzzeek/pycon2010/pull/" class="tooltip noborder link-request-pull" title="Pull request"></a> </li> <li><a href="/zzzeek/pycon2010/fork/" class="tooltip noborder link-fork" title="Fork"></a></li> <li><a href="/zzzeek/pycon2010/hack/" class="tooltip noborder link-hack" title="Patch queue"></a></li> <li><a class="tooltip noborder link-download" title="Get source"></a> <ul> <li><a rel="nofollow" href="/zzzeek/pycon2010/get/191eb2c45a3a.zip" class="zip">zip</a></li> <li><a rel="nofollow" href="/zzzeek/pycon2010/get/191eb2c45a3a.gz" class="compressed">gz</a></li> <li><a rel="nofollow" href="/zzzeek/pycon2010/get/191eb2c45a3a.bz2" class="compressed">bz2</a></li> </ul> </li> </ul> </div> <h3> <a href="/zzzeek/">zzzeek</a> / <a href="/zzzeek/pycon2010/">pycon2010</a> </h3> <p class="repo-desc-description">No description has been added.</p> <div id="repo-desc-cloneinfo">Clone this repository (size: 22.9 MB): <a href="http://bitbucket.org/zzzeek/pycon2010/" onclick="$('#clone-url-ssh').hide();$('#clone-url-https').toggle();return(false);"><small>HTTPS</small></a> / <a href="ssh://[email protected]/zzzeek/pycon2010/" onclick="$('#clone-url-https').hide();$('#clone-url-ssh').toggle();return(false);"><small>SSH</small></a><br/> <pre id="clone-url-https">$ hg clone <a href="http://bitbucket.org/zzzeek/pycon2010/">http://bitbucket.org/zzzeek/pycon2010/</a></pre> <pre id="clone-url-ssh" style="display:none;">$ hg clone <a href="ssh://[email protected]/zzzeek/pycon2010/">ssh://[email protected]/zzzeek/pycon2010/</a></pre></div> <div class="cb"></div> <a href="#" id="toggle-repo-content"></a> </div> <div id="source-summary" class="layout-box"> <div class="right"> <table> <tr> <td>commit 82:</td> <td>191eb2c45a3a</td> </tr> <tr> <td>parent 81:</td> <td> <a href="/zzzeek/pycon2010/changeset/b2406a010a1d/" title="<b>Author:</b> zzzeek<br/><b>Age:</b> 5 weeks ago<br/>annotated chap1" class="tooltip tooltip-ul">b2406a010a1d</a> </td> </tr> <tr> <td>branch: </td> <td>default</td> </tr> <tr> <td>tags:</td> <td>tip</td> </tr> </table> </div> <div class="changeset-description">- new timings now that I've actually seen the schedule. - annotate the single chapter. use newer declarative tricks</div> <div> <img src="http://www.gravatar.com/avatar/49b70b0e9c0582f9fadc962a8a5f7f12?d=identicon&s=32" class="avatar left" alt="" /> <span> Mike Bayer <br/> <small>5 weeks ago</small> </span> </div> <div class="cb"></div> </div> <div id="source-path" class="layout-box"> <a href="/zzzeek/pycon2010/src/">pycon2010</a> / <a href='/zzzeek/pycon2010/src/191eb2c45a3a/chap5/'> chap5 </a> / query_subclass.py </div> <div id="source-view" class="scroll-x"> <table class="info-table"> <tr> <th>r82:191eb2c45a3a</th> <th>108 loc</th> <th>2.4 KB</th> <th class="source-view-links"> <a id="embed-link" href="#" onclick="makeEmbed('#embed-link', 'http://bitbucket.org/zzzeek/pycon2010/src/191eb2c45a3a/chap5/query_subclass.py?embed=t');">embed</a> / <a href='/zzzeek/pycon2010/history/chap5/query_subclass.py'>history</a> / <a href='/zzzeek/pycon2010/annotate/191eb2c45a3a/chap5/query_subclass.py'>annotate</a> / <a href='/zzzeek/pycon2010/raw/191eb2c45a3a/chap5/query_subclass.py'>raw</a> / <form action="/zzzeek/pycon2010/diff/chap5/query_subclass.py" method="get" class="source-view-form"> <select name='nothing' class="smaller" disabled="disabled"> <option>No previous changes</option> </select> </form> </th> </tr> </table> <table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><a href="#cl-1"> 1</a> <a href="#cl-2"> 2</a> <a href="#cl-3"> 3</a> <a href="#cl-4"> 4</a> <a href="#cl-5"> 5</a> <a href="#cl-6"> 6</a> <a href="#cl-7"> 7</a> <a href="#cl-8"> 8</a> <a href="#cl-9"> 9</a> <a href="#cl-10"> 10</a> <a href="#cl-11"> 11</a> <a href="#cl-12"> 12</a> <a href="#cl-13"> 13</a> <a href="#cl-14"> 14</a> <a href="#cl-15"> 15</a> <a href="#cl-16"> 16</a> <a href="#cl-17"> 17</a> <a href="#cl-18"> 18</a> <a href="#cl-19"> 19</a> <a href="#cl-20"> 20</a> <a href="#cl-21"> 21</a> <a href="#cl-22"> 22</a> <a href="#cl-23"> 23</a> <a href="#cl-24"> 24</a> <a href="#cl-25"> 25</a> <a href="#cl-26"> 26</a> <a href="#cl-27"> 27</a> <a href="#cl-28"> 28</a> <a href="#cl-29"> 29</a> <a href="#cl-30"> 30</a> <a href="#cl-31"> 31</a> <a href="#cl-32"> 32</a> <a href="#cl-33"> 33</a> <a href="#cl-34"> 34</a> <a href="#cl-35"> 35</a> <a href="#cl-36"> 36</a> <a href="#cl-37"> 37</a> <a href="#cl-38"> 38</a> <a href="#cl-39"> 39</a> <a href="#cl-40"> 40</a> <a href="#cl-41"> 41</a> <a href="#cl-42"> 42</a> <a href="#cl-43"> 43</a> <a href="#cl-44"> 44</a> <a href="#cl-45"> 45</a> <a href="#cl-46"> 46</a> <a href="#cl-47"> 47</a> <a href="#cl-48"> 48</a> <a href="#cl-49"> 49</a> <a href="#cl-50"> 50</a> <a href="#cl-51"> 51</a> <a href="#cl-52"> 52</a> <a href="#cl-53"> 53</a> <a href="#cl-54"> 54</a> <a href="#cl-55"> 55</a> <a href="#cl-56"> 56</a> <a href="#cl-57"> 57</a> <a href="#cl-58"> 58</a> <a href="#cl-59"> 59</a> <a href="#cl-60"> 60</a> <a href="#cl-61"> 61</a> <a href="#cl-62"> 62</a> <a href="#cl-63"> 63</a> <a href="#cl-64"> 64</a> <a href="#cl-65"> 65</a> <a href="#cl-66"> 66</a> <a href="#cl-67"> 67</a> <a href="#cl-68"> 68</a> <a href="#cl-69"> 69</a> <a href="#cl-70"> 70</a> <a href="#cl-71"> 71</a> <a href="#cl-72"> 72</a> <a href="#cl-73"> 73</a> <a href="#cl-74"> 74</a> <a href="#cl-75"> 75</a> <a href="#cl-76"> 76</a> <a href="#cl-77"> 77</a> <a href="#cl-78"> 78</a> <a href="#cl-79"> 79</a> <a href="#cl-80"> 80</a> <a href="#cl-81"> 81</a> <a href="#cl-82"> 82</a> <a href="#cl-83"> 83</a> <a href="#cl-84"> 84</a> <a href="#cl-85"> 85</a> <a href="#cl-86"> 86</a> <a href="#cl-87"> 87</a> <a href="#cl-88"> 88</a> <a href="#cl-89"> 89</a> <a href="#cl-90"> 90</a> <a href="#cl-91"> 91</a> <a href="#cl-92"> 92</a> <a href="#cl-93"> 93</a> <a href="#cl-94"> 94</a> <a href="#cl-95"> 95</a> <a href="#cl-96"> 96</a> <a href="#cl-97"> 97</a> <a href="#cl-98"> 98</a> <a href="#cl-99"> 99</a> <a href="#cl-100">100</a> <a href="#cl-101">101</a> <a href="#cl-102">102</a> <a href="#cl-103">103</a> <a href="#cl-104">104</a> <a href="#cl-105">105</a> <a href="#cl-106">106</a> <a href="#cl-107">107</a> <a href="#cl-108">108</a> </pre></div></td><td class="code"><div class="highlight"><pre><a name="cl-1"></a><span class="c">### slide::</span> <a name="cl-2"></a> <a name="cl-3"></a><span class="c">#### Subclassing Query ####</span> <a name="cl-4"></a> <a name="cl-5"></a><span class="c"># This section illustrates a very basic Query subclass.</span> <a name="cl-6"></a><span class="c"># The purpose of this subclass is to store result sets</span> <a name="cl-7"></a><span class="c"># in a dictionary attached to the current Session, given</span> <a name="cl-8"></a><span class="c"># a key by the caller.</span> <a name="cl-9"></a><span class="c">#</span> <a name="cl-10"></a><span class="c"># suggested time for this section: 10 minutes</span> <a name="cl-11"></a> <a name="cl-12"></a><span class="c">### slide::</span> <a name="cl-13"></a> <a name="cl-14"></a><span class="c"># The Query's central point of issuing SQL and </span> <a name="cl-15"></a><span class="c"># fetching results is its __iter__ method.</span> <a name="cl-16"></a> <a name="cl-17"></a><span class="kn">from</span> <span class="nn">sqlalchemy.orm.query</span> <span class="kn">import</span> <span class="n">Query</span><span class="p">,</span> <span class="n">_generative</span> <a name="cl-18"></a> <a name="cl-19"></a><span class="k">class</span> <span class="nc">CachingQuery</span><span class="p">(</span><span class="n">Query</span><span class="p">):</span> <a name="cl-20"></a> <a name="cl-21"></a> <span class="nd">@_generative</span><span class="p">()</span> <a name="cl-22"></a> <span class="k">def</span> <span class="nf">with_cache_key</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span> <a name="cl-23"></a> <span class="sd">"""Set a cache key with which to store/retrieve results."""</span> <a name="cl-24"></a> <a name="cl-25"></a> <span class="bp">self</span><span class="o">.</span><span class="n">_cache_key</span> <span class="o">=</span> <span class="n">key</span> <a name="cl-26"></a> <a name="cl-27"></a> <span class="k">def</span> <span class="nf">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <a name="cl-28"></a> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">'_cache_key'</span><span class="p">):</span> <a name="cl-29"></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="p">,</span> <span class="s">'_cache'</span><span class="p">):</span> <a name="cl-30"></a> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">_cache</span> <span class="o">=</span> <span class="p">{}</span> <a name="cl-31"></a> <a name="cl-32"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cache_key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">_cache</span><span class="p">:</span> <a name="cl-33"></a> <span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">_cache</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_cache_key</span><span class="p">])</span> <a name="cl-34"></a> <span class="k">else</span><span class="p">:</span> <a name="cl-35"></a> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">_cache</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_cache_key</span><span class="p">]</span> <span class="o">=</span> <span class="n">result</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">Query</span><span class="o">.</span><span class="n">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span> <a name="cl-36"></a> <span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="n">result</span><span class="p">)</span> <a name="cl-37"></a> <span class="k">else</span><span class="p">:</span> <a name="cl-38"></a> <span class="k">return</span> <span class="n">Query</span><span class="o">.</span><span class="n">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <a name="cl-39"></a> <a name="cl-40"></a><span class="c">### slide::</span> <a name="cl-41"></a> <a name="cl-42"></a><span class="c"># the @_generative decorator copies the</span> <a name="cl-43"></a><span class="c"># Query first, returning the copy as the value</span> <a name="cl-44"></a><span class="c"># of 'self'</span> <a name="cl-45"></a> <a name="cl-46"></a><span class="n">c</span> <span class="o">=</span> <span class="n">CachingQuery</span><span class="p">([])</span> <a name="cl-47"></a><span class="n">c2</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">with_cache_key</span><span class="p">(</span><span class="s">'foo'</span><span class="p">)</span> <a name="cl-48"></a> <a name="cl-49"></a><span class="n">c</span><span class="p">,</span> <span class="n">c2</span> <a name="cl-50"></a> <a name="cl-51"></a><span class="n">c2</span><span class="o">.</span><span class="n">_cache_key</span> <a name="cl-52"></a> <a name="cl-53"></a><span class="c">### slide:: -*-no_exec-*-</span> <a name="cl-54"></a> <a name="cl-55"></a><span class="c"># demonstrate the CachingQuery with a quick model.</span> <a name="cl-56"></a> <a name="cl-57"></a><span class="kn">from</span> <span class="nn">sqlalchemy</span> <span class="kn">import</span> <span class="o">*</span> <a name="cl-58"></a><span class="kn">from</span> <span class="nn">sqlalchemy.orm</span> <span class="kn">import</span> <span class="o">*</span> <a name="cl-59"></a><span class="kn">from</span> <span class="nn">sqlalchemy.ext.declarative</span> <span class="kn">import</span> <span class="n">declarative_base</span> <a name="cl-60"></a> <a name="cl-61"></a><span class="n">Base</span> <span class="o">=</span> <span class="n">declarative_base</span><span class="p">()</span> <a name="cl-62"></a> <a name="cl-63"></a><span class="k">class</span> <span class="nc">Widget</span><span class="p">(</span><span class="n">Base</span><span class="p">):</span> <a name="cl-64"></a> <span class="n">__tablename__</span> <span class="o">=</span> <span class="s">'widget'</span> <a name="cl-65"></a> <a name="cl-66"></a> <span class="nb">id</span> <span class="o">=</span> <span class="n">Column</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> <a name="cl-67"></a> <span class="n">data</span> <span class="o">=</span> <span class="n">Column</span><span class="p">(</span><span class="n">String</span><span class="p">(</span><span class="mi">50</span><span class="p">),</span> <span class="n">nullable</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span> <a name="cl-68"></a> <a name="cl-69"></a><span class="n">engine</span> <span class="o">=</span> <span class="n">create_engine</span><span class="p">(</span><span class="s">'sqlite://'</span><span class="p">)</span> <a name="cl-70"></a><span class="n">Base</span><span class="o">.</span><span class="n">metadata</span><span class="o">.</span><span class="n">create_all</span><span class="p">(</span><span class="n">engine</span><span class="p">)</span> <a name="cl-71"></a> <a name="cl-72"></a><span class="c">### slide:: -*-no_exec-*-</span> <a name="cl-73"></a> <a name="cl-74"></a><span class="c"># Our custom query subclass is configured on sessionmaker().</span> <a name="cl-75"></a> <a name="cl-76"></a><span class="n">Session</span> <span class="o">=</span> <span class="n">sessionmaker</span><span class="p">(</span><span class="n">engine</span><span class="p">,</span> <span class="n">query_cls</span><span class="o">=</span><span class="n">CachingQuery</span><span class="p">)</span> <a name="cl-77"></a> <a name="cl-78"></a><span class="n">session</span> <span class="o">=</span> <span class="n">Session</span><span class="p">()</span> <a name="cl-79"></a> <a name="cl-80"></a><span class="n">session</span><span class="o">.</span><span class="n">add_all</span><span class="p">([</span> <a name="cl-81"></a> <span class="n">Widget</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="s">'w1'</span><span class="p">),</span> <a name="cl-82"></a> <span class="n">Widget</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="s">'w2'</span><span class="p">),</span> <a name="cl-83"></a> <span class="n">Widget</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="s">'w3'</span><span class="p">)</span> <a name="cl-84"></a><span class="p">])</span> <a name="cl-85"></a> <a name="cl-86"></a><span class="n">session</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span> <a name="cl-87"></a> <a name="cl-88"></a><span class="c">### slide:: -*-no_exec-*-</span> <a name="cl-89"></a> <a name="cl-90"></a><span class="c"># First usage, SQL is emitted.</span> <a name="cl-91"></a> <a name="cl-92"></a><span class="n">session</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="n">Widget</span><span class="p">)</span><span class="o">.</span><span class="n">with_cache_key</span><span class="p">(</span><span class="s">"widgets"</span><span class="p">)</span><span class="o">.</span><span class="n">all</span><span class="p">()</span> <a name="cl-93"></a> <a name="cl-94"></a><span class="c">### slide:: -*-no_exec-*-</span> <a name="cl-95"></a> <a name="cl-96"></a><span class="c"># Second usage, the cache is used, no SQL needed.</span> <a name="cl-97"></a> <a name="cl-98"></a><span class="n">session</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="n">Widget</span><span class="p">)</span><span class="o">.</span><span class="n">with_cache_key</span><span class="p">(</span><span class="s">"widgets"</span><span class="p">)</span><span class="o">.</span><span class="n">all</span><span class="p">()</span> <a name="cl-99"></a> <a name="cl-100"></a><span class="c">### slide:: -*-no_exec-*-</span> <a name="cl-101"></a> <a name="cl-102"></a><span class="c"># create a new Session. SQL is emitted again.</span> <a name="cl-103"></a> <a name="cl-104"></a><span class="n">session</span> <span class="o">=</span> <span class="n">Session</span><span class="p">()</span> <a name="cl-105"></a> <a name="cl-106"></a><span class="n">session</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="n">Widget</span><span class="p">)</span><span class="o">.</span><span class="n">with_cache_key</span><span class="p">(</span><span class="s">"widgets"</span><span class="p">)</span><span class="o">.</span><span class="n">all</span><span class="p">()</span> <a name="cl-107"></a> <a name="cl-108"></a><span class="c">### slide::</span> </pre></div> </td></tr></table> </div> <div class="cb"></div> </div> <div class="cb footer-placeholder"></div> </div> <div id="footer-wrapper"> <div id="footer"> <a href="/site/terms/">TOS</a> | <a href="/site/privacy/">Privacy Policy</a> | <a href="http://blog.bitbucket.org/">Blog</a> | <a href="http://bitbucket.org/jespern/bitbucket/issues/new/">Report Bug</a> | <a href="http://groups.google.com/group/bitbucket-users">Discuss</a> | <a href="http://avantlumiere.com/">© 2008-2010</a> | We run <small><b> <a href="http://www.djangoproject.com/">Django 1.1.0</a> / <a href="http://bitbucket.org/jespern/django-piston/">Piston 0.2.3rc1</a> / <a href="http://www.selenic.com/mercurial/">Hg 1.3.1</a> / <a href="http://www.python.org">Python 2.5.2</a> / r2855| fe01 </b></small> </div> </div> </body> </html>
-- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.
