<!doctype html> <html xmlns="http://www.w3.org/1999/xhtml" lang="en"> <head> <meta http-equiv="X-UA-Compatible" content="IE=Edge" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Inheritance — SQLObject 3.7.0 documentation</title> <link rel="stylesheet" href="_static/bizstyle.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <script type="text/javascript" src="_static/documentation_options.js"></script> <script type="text/javascript" src="_static/jquery.js"></script> <script type="text/javascript" src="_static/underscore.js"></script> <script type="text/javascript" src="_static/doctools.js"></script> <script type="text/javascript" src="_static/bizstyle.js"></script> <link rel="index" title="Index" href="genindex.html" /> <link rel="search" title="Search" href="search.html" /> <link rel="next" title="Versioning" href="Versioning.html" /> <link rel="prev" title="The sqlobject-admin Tool" href="sqlobject-admin.html" /> <meta name="viewport" content="width=device-width,initial-scale=1.0"> <!--[if lt IE 9]> <script type="text/javascript" src="_static/css3-mediaqueries.js"></script> <![endif]--> </head><body> <div class="related" role="navigation" aria-label="related navigation"> <h3>Navigation</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="genindex.html" title="General Index" accesskey="I">index</a></li> <li class="right" > <a href="py-modindex.html" title="Python Module Index" >modules</a> |</li> <li class="right" > <a href="Versioning.html" title="Versioning" accesskey="N">next</a> |</li> <li class="right" > <a href="sqlobject-admin.html" title="The sqlobject-admin Tool" accesskey="P">previous</a> |</li> <li class="nav-item nav-item-0"><a href="index.html">SQLObject 3.7.0 documentation</a> »</li> </ul> </div> <div class="sphinxsidebar" role="navigation" aria-label="main navigation"> <div class="sphinxsidebarwrapper"> <h3><a href="index.html">Table Of Contents</a></h3> <ul> <li><a class="reference internal" href="#">Inheritance</a><ul> <li><a class="reference internal" href="#why">Why</a></li> <li><a class="reference internal" href="#who-what-and-how">Who, What and How</a></li> <li><a class="reference internal" href="#limitations-and-notes">Limitations and notes</a></li> </ul> </li> </ul> <h4>Previous topic</h4> <p class="topless"><a href="sqlobject-admin.html" title="previous chapter">The sqlobject-admin Tool</a></p> <h4>Next topic</h4> <p class="topless"><a href="Versioning.html" title="next chapter">Versioning</a></p> <div role="note" aria-label="source link"> <h3>This Page</h3> <ul class="this-page-menu"> <li><a href="_sources/Inheritance.rst.txt" rel="nofollow">Show Source</a></li> </ul> </div> <div id="searchbox" style="display: none" role="search"> <h3>Quick search</h3> <div class="searchformwrapper"> <form class="search" action="search.html" method="get"> <input type="text" name="q" /> <input type="submit" value="Go" /> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> </div> </div> <script type="text/javascript">$('#searchbox').show(0);</script> </div> </div> <div class="document"> <div class="documentwrapper"> <div class="bodywrapper"> <div class="body" role="main"> <div class="contents topic" id="contents"> <p class="topic-title first">Contents</p> <ul class="simple"> <li><a class="reference internal" href="#inheritance" id="id1">Inheritance</a><ul> <li><a class="reference internal" href="#why" id="id2">Why</a></li> <li><a class="reference internal" href="#who-what-and-how" id="id3">Who, What and How</a></li> <li><a class="reference internal" href="#limitations-and-notes" id="id4">Limitations and notes</a></li> </ul> </li> </ul> </div> <div class="section" id="inheritance"> <h1><a class="toc-backref" href="#id1">Inheritance</a><a class="headerlink" href="#inheritance" title="Permalink to this headline">¶</a></h1> <div class="section" id="why"> <h2><a class="toc-backref" href="#id2">Why</a><a class="headerlink" href="#why" title="Permalink to this headline">¶</a></h2> <p>Imagine you have a list of persons, and every person plays a certain role. Some persons are students, some are professors, some are employees. Every role has different attributes. Students are known by their department and year. Professors have a department (some attributes are common for all or some roles), timetable and other attributes.</p> <p>How does one implement this in SQLObject? Well, the obvious approach is to create a table Person with a column that describes or name the role, and a table for an every role. Then one must write code that interprets and dereferences the role column.</p> <p>Well, the inheritance machinery described below does exactly this! Only it does it automagically and mostly transparent to the user.</p> <p>First, you create a table Person. Nothing magical here:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Person</span><span class="p">(</span><span class="n">SQLObject</span><span class="p">):</span> <span class="n">name</span> <span class="o">=</span> <span class="n">StringCol</span><span class="p">()</span> <span class="n">age</span> <span class="o">=</span> <span class="n">FloatCol</span><span class="p">()</span> </pre></div> </div> <p>Now you need a hierarchy of roles:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Role</span><span class="p">(</span><span class="n">InheritableSQLObject</span><span class="p">):</span> <span class="n">department</span> <span class="o">=</span> <span class="n">StringCol</span><span class="p">()</span> </pre></div> </div> <p>The magic starts here! You inherit the class from the special root class <code class="docutils literal notranslate"><span class="pre">InheritableSQLObject</span></code> and provide a set of attributes common for all roles. Other roles must be inherited from Role:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Student</span><span class="p">(</span><span class="n">Role</span><span class="p">):</span> <span class="n">year</span> <span class="o">=</span> <span class="n">IntCol</span><span class="p">()</span> <span class="k">class</span> <span class="nc">Professor</span><span class="p">(</span><span class="n">Role</span><span class="p">):</span> <span class="n">timetable</span> <span class="o">=</span> <span class="n">StringCol</span><span class="p">()</span> </pre></div> </div> <p>Now you want a column in Person that can be interpreted as the role. Easy:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Person</span><span class="p">(</span><span class="n">SQLObject</span><span class="p">):</span> <span class="n">name</span> <span class="o">=</span> <span class="n">StringCol</span><span class="p">()</span> <span class="n">age</span> <span class="o">=</span> <span class="n">FloatCol</span><span class="p">()</span> <span class="n">role</span> <span class="o">=</span> <span class="n">ForeignKey</span><span class="p">(</span><span class="s2">"Role"</span><span class="p">)</span> </pre></div> </div> <p>That’s all, really! When asked for its role, Person returns the value of its .role attribute dereferenced and interpreted. Instead of returning an instance of class Role it returns an instance of the corresponding subclass - a Student or a Professor.</p> <p>This is a brief explanation based on a task people meet most often, but of course it can be used far beyond the person/role task. I also omitted all details in the explanation. Now look at the real working program:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">sqlobject</span> <span class="k">import</span> <span class="o">*</span> <span class="kn">from</span> <span class="nn">sqlobject.inheritance</span> <span class="k">import</span> <span class="n">InheritableSQLObject</span> <span class="n">__connection__</span> <span class="o">=</span> <span class="s2">"sqlite:/:memory:"</span> <span class="k">class</span> <span class="nc">Role</span><span class="p">(</span><span class="n">InheritableSQLObject</span><span class="p">):</span> <span class="n">department</span> <span class="o">=</span> <span class="n">StringCol</span><span class="p">()</span> <span class="k">class</span> <span class="nc">Student</span><span class="p">(</span><span class="n">Role</span><span class="p">):</span> <span class="n">year</span> <span class="o">=</span> <span class="n">IntCol</span><span class="p">()</span> <span class="k">class</span> <span class="nc">Professor</span><span class="p">(</span><span class="n">Role</span><span class="p">):</span> <span class="n">timetable</span> <span class="o">=</span> <span class="n">StringCol</span><span class="p">(</span><span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span> <span class="k">class</span> <span class="nc">Person</span><span class="p">(</span><span class="n">SQLObject</span><span class="p">):</span> <span class="n">name</span> <span class="o">=</span> <span class="n">StringCol</span><span class="p">()</span> <span class="n">age</span> <span class="o">=</span> <span class="n">FloatCol</span><span class="p">()</span> <span class="n">role</span> <span class="o">=</span> <span class="n">ForeignKey</span><span class="p">(</span><span class="s2">"Role"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span> <span class="n">Role</span><span class="o">.</span><span class="n">createTable</span><span class="p">()</span> <span class="n">Student</span><span class="o">.</span><span class="n">createTable</span><span class="p">()</span> <span class="n">Professor</span><span class="o">.</span><span class="n">createTable</span><span class="p">()</span> <span class="n">Person</span><span class="o">.</span><span class="n">createTable</span><span class="p">()</span> <span class="n">first_year</span> <span class="o">=</span> <span class="n">Student</span><span class="p">(</span><span class="n">department</span><span class="o">=</span><span class="s2">"CS"</span><span class="p">,</span> <span class="n">year</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> <span class="n">lecturer</span> <span class="o">=</span> <span class="n">Professor</span><span class="p">(</span><span class="n">department</span><span class="o">=</span><span class="s2">"Mathematics"</span><span class="p">)</span> <span class="n">student</span> <span class="o">=</span> <span class="n">Person</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s2">"A student"</span><span class="p">,</span> <span class="n">age</span><span class="o">=</span><span class="mi">21</span><span class="p">,</span> <span class="n">role</span><span class="o">=</span><span class="n">first_year</span><span class="p">)</span> <span class="n">professor</span> <span class="o">=</span> <span class="n">Person</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s2">"A professor"</span><span class="p">,</span> <span class="n">age</span><span class="o">=</span><span class="mi">42</span><span class="p">,</span> <span class="n">role</span><span class="o">=</span><span class="n">lecturer</span><span class="p">)</span> <span class="nb">print</span> <span class="n">student</span><span class="o">.</span><span class="n">role</span> <span class="nb">print</span> <span class="n">professor</span><span class="o">.</span><span class="n">role</span> </pre></div> </div> <p>It prints:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o"><</span><span class="n">Student</span> <span class="mi">1</span> <span class="n">year</span><span class="o">=</span><span class="mi">1</span> <span class="n">department</span><span class="o">=</span><span class="s1">'CS'</span><span class="o">></span> <span class="o"><</span><span class="n">Professor</span> <span class="mi">2</span> <span class="n">timetable</span><span class="o">=</span><span class="kc">None</span> <span class="n">department</span><span class="o">=</span><span class="s1">'Mathematics'</span><span class="o">></span> </pre></div> </div> <p>You can get the list of all available roles:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="nb">print</span> <span class="nb">list</span><span class="p">(</span><span class="n">Role</span><span class="o">.</span><span class="n">select</span><span class="p">())</span> </pre></div> </div> <p>It prints:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="o"><</span><span class="n">Student</span> <span class="mi">1</span> <span class="n">year</span><span class="o">=</span><span class="mi">1</span> <span class="n">department</span><span class="o">=</span><span class="s1">'CS'</span><span class="o">></span><span class="p">,</span> <span class="o"><</span><span class="n">Professor</span> <span class="mi">2</span> <span class="n">timetable</span><span class="o">=</span><span class="kc">None</span> <span class="n">department</span><span class="o">=</span><span class="s1">'Mathematics'</span><span class="o">></span><span class="p">]</span> </pre></div> </div> <p>Look - you have gotten a list of Role’s subclasses!</p> <p>If you add a MultipleJoin column to Role, you can list all persons for a given role:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Role</span><span class="p">(</span><span class="n">InheritableSQLObject</span><span class="p">):</span> <span class="n">department</span> <span class="o">=</span> <span class="n">StringCol</span><span class="p">()</span> <span class="n">persons</span> <span class="o">=</span> <span class="n">MultipleJoin</span><span class="p">(</span><span class="s2">"Person"</span><span class="p">)</span> <span class="k">for</span> <span class="n">role</span> <span class="ow">in</span> <span class="n">Role</span><span class="o">.</span><span class="n">select</span><span class="p">():</span> <span class="nb">print</span> <span class="n">role</span><span class="o">.</span><span class="n">persons</span> </pre></div> </div> <p>It prints:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="o"><</span><span class="n">Person</span> <span class="mi">1</span> <span class="n">name</span><span class="o">=</span><span class="s1">'A student'</span> <span class="n">age</span><span class="o">=</span><span class="mf">21.0</span> <span class="n">roleID</span><span class="o">=</span><span class="mi">1</span><span class="o">></span><span class="p">]</span> <span class="p">[</span><span class="o"><</span><span class="n">Person</span> <span class="mi">2</span> <span class="n">name</span><span class="o">=</span><span class="s1">'A professor'</span> <span class="n">age</span><span class="o">=</span><span class="mf">42.0</span> <span class="n">roleID</span><span class="o">=</span><span class="mi">2</span><span class="o">></span><span class="p">]</span> </pre></div> </div> <p>If you you want your persons to have many roles, use RelatedJoin:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Role</span><span class="p">(</span><span class="n">InheritableSQLObject</span><span class="p">):</span> <span class="n">department</span> <span class="o">=</span> <span class="n">StringCol</span><span class="p">()</span> <span class="n">persons</span> <span class="o">=</span> <span class="n">RelatedJoin</span><span class="p">(</span><span class="s2">"Person"</span><span class="p">)</span> <span class="k">class</span> <span class="nc">Student</span><span class="p">(</span><span class="n">Role</span><span class="p">):</span> <span class="n">year</span> <span class="o">=</span> <span class="n">IntCol</span><span class="p">()</span> <span class="k">class</span> <span class="nc">Professor</span><span class="p">(</span><span class="n">Role</span><span class="p">):</span> <span class="n">timetable</span> <span class="o">=</span> <span class="n">StringCol</span><span class="p">(</span><span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span> <span class="k">class</span> <span class="nc">Person</span><span class="p">(</span><span class="n">SQLObject</span><span class="p">):</span> <span class="n">name</span> <span class="o">=</span> <span class="n">StringCol</span><span class="p">()</span> <span class="n">age</span> <span class="o">=</span> <span class="n">FloatCol</span><span class="p">()</span> <span class="n">roles</span> <span class="o">=</span> <span class="n">RelatedJoin</span><span class="p">(</span><span class="s2">"Role"</span><span class="p">)</span> <span class="n">Role</span><span class="o">.</span><span class="n">createTable</span><span class="p">()</span> <span class="n">Student</span><span class="o">.</span><span class="n">createTable</span><span class="p">()</span> <span class="n">Professor</span><span class="o">.</span><span class="n">createTable</span><span class="p">()</span> <span class="n">Person</span><span class="o">.</span><span class="n">createTable</span><span class="p">()</span> <span class="n">first_year</span> <span class="o">=</span> <span class="n">Student</span><span class="p">(</span><span class="n">department</span><span class="o">=</span><span class="s2">"CS"</span><span class="p">,</span> <span class="n">year</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> <span class="n">lecturer</span> <span class="o">=</span> <span class="n">Professor</span><span class="p">(</span><span class="n">department</span><span class="o">=</span><span class="s2">"Mathematics"</span><span class="p">)</span> <span class="n">student</span> <span class="o">=</span> <span class="n">Person</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s2">"A student"</span><span class="p">,</span> <span class="n">age</span><span class="o">=</span><span class="mi">21</span><span class="p">)</span> <span class="n">student</span><span class="o">.</span><span class="n">addRole</span><span class="p">(</span><span class="n">first_year</span><span class="p">)</span> <span class="n">professor</span> <span class="o">=</span> <span class="n">Person</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s2">"A professor"</span><span class="p">,</span> <span class="n">age</span><span class="o">=</span><span class="mi">42</span><span class="p">)</span> <span class="n">professor</span><span class="o">.</span><span class="n">addRole</span><span class="p">(</span><span class="n">lecturer</span><span class="p">)</span> <span class="nb">print</span> <span class="n">student</span><span class="o">.</span><span class="n">roles</span> <span class="nb">print</span> <span class="n">professor</span><span class="o">.</span><span class="n">roles</span> <span class="k">for</span> <span class="n">role</span> <span class="ow">in</span> <span class="n">Role</span><span class="o">.</span><span class="n">select</span><span class="p">():</span> <span class="nb">print</span> <span class="n">role</span><span class="o">.</span><span class="n">persons</span> </pre></div> </div> <p>It prints:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="o"><</span><span class="n">Student</span> <span class="mi">1</span> <span class="n">year</span><span class="o">=</span><span class="mi">1</span> <span class="n">department</span><span class="o">=</span><span class="s1">'CS'</span><span class="o">></span><span class="p">]</span> <span class="p">[</span><span class="o"><</span><span class="n">Professor</span> <span class="mi">2</span> <span class="n">timetable</span><span class="o">=</span><span class="kc">None</span> <span class="n">department</span><span class="o">=</span><span class="s1">'Mathematics'</span><span class="o">></span><span class="p">]</span> <span class="p">[</span><span class="o"><</span><span class="n">Person</span> <span class="mi">1</span> <span class="n">name</span><span class="o">=</span><span class="s1">'A student'</span> <span class="n">age</span><span class="o">=</span><span class="mf">21.0</span><span class="o">></span><span class="p">]</span> <span class="p">[</span><span class="o"><</span><span class="n">Person</span> <span class="mi">2</span> <span class="n">name</span><span class="o">=</span><span class="s1">'A professor'</span> <span class="n">age</span><span class="o">=</span><span class="mf">42.0</span><span class="o">></span><span class="p">]</span> </pre></div> </div> </div> <div class="section" id="who-what-and-how"> <h2><a class="toc-backref" href="#id3">Who, What and How</a><a class="headerlink" href="#who-what-and-how" title="Permalink to this headline">¶</a></h2> <p>Daniel Savard has implemented inheritance for SQLObject. In <a class="reference external" href="https://cayenne.apache.org/docs/3.0/modeling-inheritance.html">terms of ORM</a> this is a kind of vertical inheritance. The only difference is that objects reference their leaves, not parents. Links to parents are reconstructed at run-time using the hierarchy of Python classes.</p> <ul class="simple"> <li>As suggested by Ian Bicking, each child class now has the same ID as the parent class. No more need for childID column and parent foreignKey (and a small speed boost).</li> <li>No more need to call getSubClass, as the ‘latest’ child will always be returned when an instance of a class is created.</li> <li>This version now seems to work correctly with addColumn, delColumn, addJoin and delJoin.</li> </ul> <p>The following code:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">sqlobject.inheritance</span> <span class="k">import</span> <span class="n">InheritableSQLObject</span> <span class="k">class</span> <span class="nc">Person</span><span class="p">(</span><span class="n">InheritableSQLObject</span><span class="p">):</span> <span class="n">firstName</span> <span class="o">=</span> <span class="n">StringCol</span><span class="p">()</span> <span class="n">lastName</span> <span class="o">=</span> <span class="n">StringCol</span><span class="p">()</span> <span class="k">class</span> <span class="nc">Employee</span><span class="p">(</span><span class="n">Person</span><span class="p">):</span> <span class="n">_inheritable</span> <span class="o">=</span> <span class="kc">False</span> <span class="n">position</span> <span class="o">=</span> <span class="n">StringCol</span><span class="p">()</span> </pre></div> </div> <p>will generate the following tables:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">CREATE</span> <span class="n">TABLE</span> <span class="n">person</span> <span class="p">(</span> <span class="nb">id</span> <span class="n">INT</span> <span class="n">PRIMARY</span> <span class="n">KEY</span><span class="p">,</span> <span class="n">child_name</span> <span class="n">TEXT</span><span class="p">,</span> <span class="n">first_name</span> <span class="n">TEXT</span><span class="p">,</span> <span class="n">last_name</span> <span class="n">TEXT</span> <span class="p">);</span> <span class="n">CREATE</span> <span class="n">TABLE</span> <span class="n">employee</span> <span class="p">(</span> <span class="nb">id</span> <span class="n">INT</span> <span class="n">PRIMARY</span> <span class="n">KEY</span><span class="p">,</span> <span class="n">position</span> <span class="n">TEXT</span> <span class="p">)</span> </pre></div> </div> <p>A new class attribute <code class="docutils literal notranslate"><span class="pre">_inheritable</span></code> is added. When this new attribute is set to 1, the class is marked ‘inheritable’ and a new columns will automatically be added: childName (TEXT).</p> <p>Each class that inherits from a parent class will get the same ID as the parent class. So, there is no need to keep track of parent ID and child ID, as they are the same.</p> <p>The column childName will contain the name of the child class (for example ‘Employee’). This will permit a class to always return its child class if available (a person that is also an employee will always return an instance of the employee class).</p> <p>For example, the following code:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">p</span> <span class="o">=</span> <span class="n">Person</span><span class="p">(</span><span class="n">firstName</span><span class="o">=</span><span class="s1">'John'</span><span class="p">,</span> <span class="n">lastName</span><span class="o">=</span><span class="s1">'Doe'</span><span class="p">)</span> <span class="n">e</span> <span class="o">=</span> <span class="n">Employee</span><span class="p">(</span><span class="n">firstName</span><span class="o">=</span><span class="s1">'Jane'</span><span class="p">,</span> <span class="n">lastName</span><span class="o">=</span><span class="s1">'Doe'</span><span class="p">,</span> <span class="n">position</span><span class="o">=</span><span class="s1">'Chief'</span><span class="p">)</span> <span class="n">p2</span> <span class="o">=</span> <span class="n">Person</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> </pre></div> </div> <p>Will create the following data in the database:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">*</span><span class="n">Person</span><span class="o">*</span> <span class="nb">id</span> <span class="n">child_name</span> <span class="n">first_name</span> <span class="n">last_name</span> <span class="mi">0</span> <span class="n">Null</span> <span class="n">John</span> <span class="n">Doe</span> <span class="mi">1</span> <span class="n">Employee</span> <span class="n">Jane</span> <span class="n">Doe</span> <span class="o">*</span><span class="n">Employee</span><span class="o">*</span> <span class="nb">id</span> <span class="n">position</span> <span class="mi">1</span> <span class="n">Chief</span> </pre></div> </div> <p>You will still be able to ask for the attribute normally: e.firstName will return Jane and setting it will write the new value in the person table.</p> <p>If you use p2, as p2 is a person object, you will get an employee object. person(0) will return a Person instance and will have the following attributes: firstName and lastName. person(1) or employee(1) will both return the same Employee instance and will have the following attributes: firstName, lastName and position.</p> <p>Also, deleting a person or an employee that is linked will destroy both entries as one would expect.</p> <p>The SQLObject q magic also works. Using these selects is valid:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Employee</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">AND</span><span class="p">(</span><span class="n">Employee</span><span class="o">.</span><span class="n">q</span><span class="o">.</span><span class="n">firstName</span> <span class="o">==</span> <span class="s1">'Jane'</span><span class="p">,</span> <span class="n">Employee</span><span class="o">.</span><span class="n">q</span><span class="o">.</span><span class="n">position</span> <span class="o">==</span> <span class="s1">'Chief'</span><span class="p">))</span> <span class="n">will</span> <span class="k">return</span> <span class="n">Jane</span> <span class="n">Doe</span> <span class="n">Employee</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">AND</span><span class="p">(</span><span class="n">Person</span><span class="o">.</span><span class="n">q</span><span class="o">.</span><span class="n">firstName</span> <span class="o">==</span> <span class="s1">'Jane'</span><span class="p">,</span> <span class="n">Employee</span><span class="o">.</span><span class="n">q</span><span class="o">.</span><span class="n">position</span> <span class="o">==</span> <span class="s1">'Chief'</span><span class="p">))</span> <span class="n">will</span> <span class="k">return</span> <span class="n">Jane</span> <span class="n">Doe</span> <span class="n">Employee</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">Employee</span><span class="o">.</span><span class="n">q</span><span class="o">.</span><span class="n">lastName</span> <span class="o">==</span> <span class="s1">'Doe'</span><span class="p">)</span> <span class="n">will</span> <span class="n">only</span> <span class="k">return</span> <span class="n">Jane</span> <span class="n">Doe</span> <span class="p">(</span><span class="k">as</span> <span class="n">Joe</span> <span class="n">isn</span><span class="s1">'t an employee)</span> <span class="n">Person</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">Person</span><span class="o">.</span><span class="n">q</span><span class="o">.</span><span class="n">lastName</span> <span class="o">==</span> <span class="s1">'Doe'</span><span class="p">)</span> <span class="n">will</span> <span class="k">return</span> <span class="n">both</span> <span class="n">entries</span><span class="o">.</span> </pre></div> </div> <p>The SQL ‘where’ clause will contain additional clauses when used with ‘inherited’ classes. These clauses are the link between the id and the parent id. This will look like the following request:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">SELECT</span> <span class="n">employee</span><span class="o">.</span><span class="n">id</span><span class="p">,</span> <span class="n">person</span><span class="o">.</span><span class="n">first_name</span><span class="p">,</span> <span class="n">person</span><span class="o">.</span><span class="n">last_name</span> <span class="n">FROM</span> <span class="n">person</span><span class="p">,</span> <span class="n">employee</span> <span class="n">WHERE</span> <span class="n">person</span><span class="o">.</span><span class="n">first_name</span> <span class="o">=</span> <span class="s1">'Jane'</span> <span class="n">AND</span> <span class="n">employee</span><span class="o">.</span><span class="n">position</span> <span class="o">=</span> <span class="s1">'Chief'</span> <span class="n">AND</span> <span class="n">person</span><span class="o">.</span><span class="n">id</span> <span class="o">=</span> <span class="n">employee</span><span class="o">.</span><span class="n">id</span> </pre></div> </div> </div> <div class="section" id="limitations-and-notes"> <h2><a class="toc-backref" href="#id4">Limitations and notes</a><a class="headerlink" href="#limitations-and-notes" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>Only single inheritance will work. It is not possible to inherit from multiple SQLObject classes.</li> <li>It is possible to inherit from an inherited class and this will work well. In the above example, you can have a Chief class that inherits from Employee and all parents attributes will be available through the Chief class.</li> <li>You may not redefine columns in an inherited class (this will raise an exception).</li> <li>If you don’t want ‘childName’ columns in your last class (one that will never be inherited), you must set ‘_inheritable’ to False in this class.</li> <li>The inheritance implementation is incompatible with lazy updates. Do not set lazyUpdate to True. If you need this, you have to patch SQLObject and override many methods - _SO_setValue(), sync(), syncUpdate() at least. Patches will be gladly accepted.</li> <li>You’d better restrain yourself to simple use cases. The inheritance implementation is easily choked on more complex cases.</li> <li>A join between tables inherited from the same parent produces incorrect result due to joins to the same parent table (they must use different aliases).</li> <li>Inheritance works in two stages - first it draws the IDs from the parent table and then it draws the rows from the children tables. The first stage could fail if you try to do complex things. For example, Children.select(orderBy=Children.q.column, distinct=True) could fail because at the first stage inheritance generates a SELECT query for the parent table with ORDER BY the column from the children table.</li> <li>I made it because I needed to be able to have automatic inheritance with linked tables.</li> <li>This version works for me; it may not work for you. I tried to do my best but it is possible that I broke some things… So, there is no warranty that this version will work.</li> <li>Thanks to Ian Bicking for SQLObject; this is a wonderful python module.</li> <li>Although all the attributes are inherited, the same does not apply to sqlmeta data. Don’t try to get a parent column via the sqlmeta.columns dictionary of an inherited InheritableSQLObject: it will raise a KeyError. The same applies to joins: the sqlmeta.joins list will be empty in an inherited InheritableSQLObject if a join has been defined in the parent class, even though the join method will work correctly.</li> <li>If you have suggestion, bugs, or patch to this patch, you can contact the SQLObject team: <sqlobject-discuss at lists.sourceforge.net></li> </ul> <a class="reference external image-reference" href="https://sourceforge.net/projects/sqlobject"><img alt="Get SQLObject at SourceForge.net. Fast, secure and Free Open Source software downloads" class="noborder align-center" src="https://sourceforge.net/sflogo.php?group_id=74338&type=10" style="width: 80px; height: 15px;" /></a> </div> </div> </div> </div> </div> <div class="clearer"></div> </div> <div class="related" role="navigation" aria-label="related navigation"> <h3>Navigation</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="genindex.html" title="General Index" >index</a></li> <li class="right" > <a href="py-modindex.html" title="Python Module Index" >modules</a> |</li> <li class="right" > <a href="Versioning.html" title="Versioning" >next</a> |</li> <li class="right" > <a href="sqlobject-admin.html" title="The sqlobject-admin Tool" >previous</a> |</li> <li class="nav-item nav-item-0"><a href="index.html">SQLObject 3.7.0 documentation</a> »</li> </ul> </div> <div class="footer" role="contentinfo"> © Copyright 2004-2018, Ian Bicking and contributors. Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.7.4. </div> </body> </html>