<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Database on Haseeb Majid</title>
    <link>https://haseebmajid.dev/tags/database/</link>
    <description>Recent content in Database on Haseeb Majid</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Thu, 18 Oct 2018 00:00:00 +0000</lastBuildDate><atom:link href="https://haseebmajid.dev/tags/database/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Inheritance in SQLAlchemy (with Flask)</title>
      <link>https://haseebmajid.dev/posts/2018-10-18-inheritance-in-sqlalchemy-with-flask/</link>
      <pubDate>Thu, 18 Oct 2018 00:00:00 +0000</pubDate>
      <author>Me</author>
      <guid>https://haseebmajid.dev/posts/2018-10-18-inheritance-in-sqlalchemy-with-flask/</guid>
      <description>&lt;p&gt;SQLAlchemy is an Object-relational mapping (ORM) made for the Python programming language. ORMs in theory allow
programmers to abstract away SQL. In simple terms they allow us to interact with a database using purely Python
(objects/functions). I will be using the flask-SQLAlchemy extension for my examples.&lt;/p&gt;
&lt;p&gt;Each table is referred to as a model, each model is simply just a python class and each attribute of that class
becomes a column in an SQL table. The database is made up of multiple models. Just like with normal Python models
can inherit from other models and share attributes with the parent model. This is very useful if you going to
have models that will store similar types of data.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>SQLAlchemy is an Object-relational mapping (ORM) made for the Python programming language. ORMs in theory allow
programmers to abstract away SQL. In simple terms they allow us to interact with a database using purely Python
(objects/functions). I will be using the flask-SQLAlchemy extension for my examples.</p>
<p>Each table is referred to as a model, each model is simply just a python class and each attribute of that class
becomes a column in an SQL table. The database is made up of multiple models. Just like with normal Python models
can inherit from other models and share attributes with the parent model. This is very useful if you going to
have models that will store similar types of data.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">flask_sqlalchemy</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">db</span> <span class="o">=</span> <span class="n">flask_sqlalchemy</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">Pets</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">__abstract__</span> <span class="o">=</span> <span class="kc">True</span>
</span></span><span class="line"><span class="cl">    <span class="n">name</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">String</span><span class="p">(</span><span class="mi">100</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    <span class="n">price</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Integer</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">breed</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">String</span><span class="p">(</span><span class="mi">100</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">Cats</span><span class="p">(</span><span class="n">Pets</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">__tablename__</span> <span class="o">=</span> <span class="s1">&#39;cats&#39;</span>
</span></span><span class="line"><span class="cl">    <span class="nb">id</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Integer</span><span class="p">,</span> <span class="n">primary_key</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">Dogs</span><span class="p">(</span><span class="n">Pets</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">__tablename__</span> <span class="o">=</span> <span class="s1">&#39;dogs&#39;</span>
</span></span><span class="line"><span class="cl">    <span class="nb">id</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Integer</span><span class="p">,</span> <span class="n">primary_key</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span></code></pre></div><p>Taking a look at the <em>models.py</em> module, we define an abstract class called Pets. Which means SQLAlchemy will not create
a table for that model. Our next two models Cats and Dogs inherit all the attributes form Pets. So Cats and Dog tables
will each have a column called name, price and breed. The main advantage of this is if you ever need to change the
models you just have to change it in once place. The more models that inherit from the base model.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">Flask</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">.models</span> <span class="kn">import</span> <span class="n">db</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">uri</span> <span class="o">=</span> <span class="s2">&#34;mysql+pymysql://user:password@localhost:3306/test&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">app</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">&#39;SQLALCHEMY_DATABASE_URI&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">uri</span>
</span></span><span class="line"><span class="cl"><span class="n">app</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">&#39;SQLALCHEMY_TRACK_MODIFICATIONS&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">False</span>
</span></span><span class="line"><span class="cl"><span class="n">app</span><span class="o">.</span><span class="n">app_context</span><span class="p">()</span><span class="o">.</span><span class="n">push</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">db</span><span class="o">.</span><span class="n">init_app</span><span class="p">(</span><span class="n">app</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">db</span><span class="o">.</span><span class="n">create_all</span><span class="p">()</span>
</span></span></code></pre></div><p>Above is an example <code>__init__.py</code> file to initialise the database and create all the database tables from the
models. That&rsquo;s it folks, thanks for reading.</p>
<p><strong>Please</strong> note there are other ways to implement inheritance with SQLAlchemy, I personally found this way to be the
cleanest in terms of code readability.</p>
<hr>
<h2 id="appendix">Appendix</h2>
<ul>
<li><a href="https://gitlab.com/hmajid2301/blog/-/tree/main/content/posts/2018-10-18-inheritance-in-sqlalchemy-with-flask/source_code/source_code/example">Example source code</a></li>
<li><a href="https://www.sqlalchemy.org/">SQLAlchemy</a></li>
<li><a href="http://flask-sqlalchemy.pocoo.org/2.3/">flask-sqlalchemy</a></li>
</ul>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
