<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Postgres - Tag - Simon Jakubowski</title><link>https://sijakubo.github.io/info/tags/postgres/</link><description>Postgres - Tag - Simon Jakubowski</description><generator>Hugo -- gohugo.io</generator><language>en</language><managingEditor>sijakubo@gmail.com ( Simon Jakubowski)</managingEditor><webMaster>sijakubo@gmail.com ( Simon Jakubowski)</webMaster><lastBuildDate>Tue, 03 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://sijakubo.github.io/info/tags/postgres/" rel="self" type="application/rss+xml"/><item><title>Forget CSV or Excel files. Share your Data with Apache Parquet</title><link>https://sijakubo.github.io/info/posts/post-12/</link><pubDate>Tue, 03 Mar 2026 00:00:00 +0000</pubDate><author>sijakubo@gmail.com ( Simon Jakubowski)</author><guid>https://sijakubo.github.io/info/posts/post-12/</guid><description><![CDATA[<h2 id="what-is-apache-parquet">What is Apache Parquet?</h2>
<p>Apache Parquet is an open source, column-oriented data file format designed for efficient data storage and retrieval.</p>
<p>It provides:</p>
<ul>
<li>High-performance compression</li>
<li>Efficient encoding schemes</li>
<li>Support for complex data types</li>
<li>Broad adoption across analytics tools and programming languages</li>
</ul>
<p>Parquet is commonly used as a table replacement for analytical workloads.</p>
<hr>
<h2 id="how-to-create-parquet-files">How to Create Parquet Files</h2>
<p>There are several ways to create Parquet files:</p>
<ul>
<li>From CSV files</li>
<li>Directly from PostgreSQL using the <code>pg_parquet</code> extension</li>
<li>Using DuckDB</li>
<li>Using web-based CSV to Parquet converters</li>
</ul>
<p>In this post, DuckDB is used as a lightweight and practical tool to generate and query Parquet files.</p>]]></description></item><item><title>Create a Feature Collection from Postgis Geometries using Postgis &gt;= 3.0.0</title><link>https://sijakubo.github.io/info/posts/post-8/</link><pubDate>Thu, 27 Apr 2023 00:00:00 +0000</pubDate><author>sijakubo@gmail.com ( Simon Jakubowski)</author><guid>https://sijakubo.github.io/info/posts/post-8/</guid><description><![CDATA[<p>Generating a Feature and Feature Collection form postgis is rather simple. If you convert a simple <a href="https://postgis.net/docs/geometry.html">GEOMETRY</a> with the <a href="https://postgis.net/docs/ST_AsGeoJSON.html"><code>st_asgeojson</code></a> postgis will generate a GeoJSON &ldquo;geometry&rdquo;.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w"> </span><span class="n">st_asgeojson</span><span class="p">(</span><span class="n">f</span><span class="p">.</span><span class="n">geometry</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">FROM</span><span class="w"> </span><span class="n">field</span><span class="w"> </span><span class="n">f</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><p>will result in a single geometry:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;type&#34;</span> <span class="p">:</span> <span class="s2">&#34;Polygon&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;coordinates&#34;</span> <span class="p">:</span> <span class="p">[</span><span class="err">...</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>If you provide a <strong>RECORD</strong> (since Postgis 3.0.0), postgis will generate a Feature with all the fields as Properties:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w"> </span><span class="n">st_asgeojson</span><span class="p">(</span><span class="n">f</span><span class="p">.</span><span class="o">*</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">FROM</span><span class="w"> </span><span class="n">field</span><span class="w"> </span><span class="n">f</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><p>will result in:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;type&#34;</span> <span class="p">:</span> <span class="s2">&#34;Feature&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;geometry&#34;</span> <span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;type&#34;</span> <span class="p">:</span> <span class="s2">&#34;Polygon&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;coordinates&#34;</span> <span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">      <span class="err">...</span>
</span></span><span class="line"><span class="cl">    <span class="p">]</span>
</span></span><span class="line"><span class="cl">  <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;properties&#34;</span> <span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;id&#34;</span> <span class="p">:</span> <span class="s2">&#34;052ff36a-4ea7-4307-9bc3-414f49a62163&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;area_square_meters&#34;</span> <span class="p">:</span> <span class="mi">29434</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;altitude&#34;</span> <span class="p">:</span> <span class="mi">40</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;granule_code&#34;</span> <span class="p">:</span> <span class="s2">&#34;31UGT&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;creation_date&#34;</span> <span class="p">:</span> <span class="s2">&#34;2021-10-21T23:32:25.974059&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;name&#34;</span> <span class="p">:</span> <span class="s2">&#34;Simple test field&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="err">...</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Where the field table having the Columns: <code>id</code>, <code>area_square_meters</code>, &hellip;</p>]]></description></item><item><title>PostgreSQL Composite Types to reduce boilerplate code from you database schema</title><link>https://sijakubo.github.io/info/posts/post-7/</link><pubDate>Thu, 30 Mar 2023 00:00:00 +0000</pubDate><author>sijakubo@gmail.com ( Simon Jakubowski)</author><guid>https://sijakubo.github.io/info/posts/post-7/</guid><description><![CDATA[<p>PostgreSQL is a powerful and flexible open-source relational database management system. One of its most useful features is the ability to define <a href="https://www.postgresql.org/docs/current/rowtypes.html">custom composite types</a> (Since Postgres 11), which are user-defined data types that combine multiple fields of different types into a single logical entity. In this article, we&rsquo;ll explore the benefits of using composite types in PostgreSQL and how to use them in your database schema.</p>
<h3 id="create-composite-type">Create Composite Type</h3>
<p>To define a composite type in PostgreSQL, you use the CREATE TYPE statement, followed by the name of the type and a list of its component fields and types. For example, here&rsquo;s how you might define a audit type:</p>]]></description></item><item><title>Zero downtime deployment with breaking DB-Schema change - by example</title><link>https://sijakubo.github.io/info/posts/post-6/</link><pubDate>Thu, 12 Jan 2023 00:00:00 +0000</pubDate><author>sijakubo@gmail.com ( Simon Jakubowski)</author><guid>https://sijakubo.github.io/info/posts/post-6/</guid><description><![CDATA[<p>When running multiple Server nodes, sharing the same Database, it becomes more and more important to handle backwards compatibility on the database especially during Deployments.</p>
<p>When we start da Deployment, a new Server node is being deployed to a cluster. This node will then migrate the Database to it&rsquo;s designated schema version. If this new version is not backwards compatible, the currently running Server instances will run into several problems, reading or writing to the database.</p>]]></description></item><item><title>Testcontainers | Postgres: Postgis with Spring and Spock</title><link>https://sijakubo.github.io/info/posts/post-5/</link><pubDate>Tue, 18 Oct 2022 00:00:00 +0000</pubDate><author>sijakubo@gmail.com ( Simon Jakubowski)</author><guid>https://sijakubo.github.io/info/posts/post-5/</guid><description><![CDATA[<p>A great way to include all the required resources for integration tests, <a href="https://www.testcontainers.org/">Testcontainers</a> provides an easy way to start docker containers from within your testcode. This removes the necessity to create test <code>docker-compose.yml</code> files and write <code>README.md</code> code on how to even run a test.</p>
<p>Here is a short example using testcontainers with Spring and Spock on a Postgis / Postgres database.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-groovy" data-lang="groovy"><span class="line"><span class="cl"><span class="nd">@SpringBootTest</span>
</span></span><span class="line"><span class="cl"><span class="nd">@AutoConfigureMockMvc</span>
</span></span><span class="line"><span class="cl"><span class="nd">@AutoConfigureTestDatabase</span><span class="o">(</span><span class="n">replace</span> <span class="o">=</span> <span class="n">AutoConfigureTestDatabase</span><span class="o">.</span><span class="na">Replace</span><span class="o">.</span><span class="na">NONE</span><span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="nd">@ContextConfiguration</span><span class="o">(</span><span class="n">initializers</span> <span class="o">=</span> <span class="o">[</span><span class="n">Initializer</span><span class="o">.</span><span class="na">class</span><span class="o">])</span>
</span></span><span class="line"><span class="cl"><span class="kd">class</span> <span class="nc">FieldControllerTest</span> <span class="kd">extends</span> <span class="n">IntegrationTest</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nd">@Shared</span>
</span></span><span class="line"><span class="cl">  <span class="kd">public</span> <span class="kd">static</span> <span class="n">JdbcDatabaseContainer</span> <span class="n">postgreSQLContainer</span> <span class="o">=</span> <span class="k">new</span> <span class="n">PostgisContainerProvider</span><span class="o">()</span>
</span></span><span class="line"><span class="cl">    <span class="o">.</span><span class="na">newInstance</span><span class="o">()</span>
</span></span><span class="line"><span class="cl">    <span class="o">.</span><span class="na">withDatabaseName</span><span class="o">(</span><span class="s2">&#34;integration-tests-db&#34;</span><span class="o">)</span>
</span></span><span class="line"><span class="cl">    <span class="o">.</span><span class="na">withUsername</span><span class="o">(</span><span class="s2">&#34;sa&#34;</span><span class="o">)</span>
</span></span><span class="line"><span class="cl">    <span class="o">.</span><span class="na">withPassword</span><span class="o">(</span><span class="s2">&#34;sa&#34;</span><span class="o">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kd">static</span> <span class="kd">class</span> <span class="nc">Initializer</span> <span class="kd">implements</span> <span class="n">ApplicationContextInitializer</span><span class="o">&lt;</span><span class="n">ConfigurableApplicationContext</span><span class="o">&gt;</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kt">void</span> <span class="nf">initialize</span><span class="o">(</span><span class="n">ConfigurableApplicationContext</span> <span class="n">configurableApplicationContext</span><span class="o">)</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">      <span class="n">postgreSQLContainer</span><span class="o">.</span><span class="na">start</span><span class="o">()</span>
</span></span><span class="line"><span class="cl">      <span class="n">TestPropertyValues</span><span class="o">.</span><span class="na">of</span><span class="o">(</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;spring.datasource.url=&#34;</span> <span class="o">+</span> <span class="n">postgreSQLContainer</span><span class="o">.</span><span class="na">getJdbcUrl</span><span class="o">(),</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;spring.datasource.username=&#34;</span> <span class="o">+</span> <span class="n">postgreSQLContainer</span><span class="o">.</span><span class="na">getUsername</span><span class="o">(),</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;spring.datasource.password=&#34;</span> <span class="o">+</span> <span class="n">postgreSQLContainer</span><span class="o">.</span><span class="na">getPassword</span><span class="o">()</span>
</span></span><span class="line"><span class="cl">      <span class="o">).</span><span class="na">applyTo</span><span class="o">(</span><span class="n">configurableApplicationContext</span><span class="o">.</span><span class="na">getEnvironment</span><span class="o">());</span>
</span></span><span class="line"><span class="cl">    <span class="o">}</span>
</span></span><span class="line"><span class="cl">  <span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nd">@Autowired</span>
</span></span><span class="line"><span class="cl">  <span class="n">MockMvc</span> <span class="n">mockMvc</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nd">@Autowired</span>
</span></span><span class="line"><span class="cl">  <span class="n">FieldRepository</span> <span class="n">fieldRepository</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kt">void</span> <span class="nf">setup</span><span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">fieldRepository</span><span class="o">.</span><span class="na">save</span><span class="o">(</span><span class="k">new</span> <span class="n">Field</span><span class="o">(</span>
</span></span><span class="line"><span class="cl">      <span class="n">UUID</span><span class="o">.</span><span class="na">fromString</span><span class="o">(</span><span class="s1">&#39;ad68f894-c16b-4953-b577-7cddb3e85ae5&#39;</span><span class="o">),</span> <span class="s2">&#34;initSampleField&#34;</span><span class="o">,</span>
</span></span><span class="line"><span class="cl">      <span class="k">new</span> <span class="nf">Polygon</span><span class="o">(</span>
</span></span><span class="line"><span class="cl">        <span class="n">PositionSequenceBuilders</span><span class="o">.</span><span class="na">variableSized</span><span class="o">(</span><span class="n">G2D</span><span class="o">.</span><span class="na">class</span><span class="o">)</span>
</span></span><span class="line"><span class="cl">          <span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="mf">5.8208837124389</span><span class="o">,</span> <span class="mf">51.0596004663904</span><span class="o">)</span>
</span></span><span class="line"><span class="cl">          <span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="mf">5.83490292265498</span><span class="o">,</span> <span class="mf">51.0571257015788</span><span class="o">)</span>
</span></span><span class="line"><span class="cl">          <span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="mf">5.87078646658134</span><span class="o">,</span> <span class="mf">51.0451607414904</span><span class="o">)</span>
</span></span><span class="line"><span class="cl">          <span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="mf">5.79146302423308</span><span class="o">,</span> <span class="mf">51.0612386272784</span><span class="o">)</span>
</span></span><span class="line"><span class="cl">          <span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="mf">5.8208837124389</span><span class="o">,</span> <span class="mf">51.0596004663904</span><span class="o">)</span>
</span></span><span class="line"><span class="cl">          <span class="o">.</span><span class="na">toPositionSequence</span><span class="o">(),</span>
</span></span><span class="line"><span class="cl">        <span class="n">CoordinateReferenceSystems</span><span class="o">.</span><span class="na">WGS84</span>
</span></span><span class="line"><span class="cl">      <span class="o">)</span>
</span></span><span class="line"><span class="cl">    <span class="o">))</span>
</span></span><span class="line"><span class="cl">  <span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="o">...</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span></code></pre></div><p>To integrate testcontainers into your project, you&rsquo;ll need the following dependencies:</p>]]></description></item><item><title>Postgres JSON beginner Class</title><link>https://sijakubo.github.io/info/posts/post-4/</link><pubDate>Sat, 10 Jul 2021 00:00:00 +0000</pubDate><author>sijakubo@gmail.com ( Simon Jakubowski)</author><guid>https://sijakubo.github.io/info/posts/post-4/</guid><description><![CDATA[<p>Operators see: <a href="https://www.postgresql.org/docs/9.5/functions-json.html">https://www.postgresql.org/docs/9.5/functions-json.html</a></p>
<h1 id="create-column-using-jsonb">Create column using jsonb</h1>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">article</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">id</span><span class="w">      </span><span class="n">UUID</span><span class="w"> </span><span class="k">PRIMARY</span><span class="w"> </span><span class="k">KEY</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">properties</span><span class="w"> </span><span class="n">JSONB</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">);</span><span class="w">
</span></span></span></code></pre></div><h1 id="insert-values">Insert values</h1>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">INSERT</span><span class="w"> </span><span class="k">INTO</span><span class="w"> </span><span class="n">article</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">VALUES</span><span class="w"> </span><span class="p">(</span><span class="n">gen_random_uuid</span><span class="p">(),</span><span class="w"> </span><span class="s1">&#39;{
</span></span></span><span class="line"><span class="cl"><span class="s1">  &#34;price&#34;: 12.1,
</span></span></span><span class="line"><span class="cl"><span class="s1">  &#34;name&#34;: &#34;Kugelschreiber&#34;,
</span></span></span><span class="line"><span class="cl"><span class="s1">  &#34;tags&#34;: {
</span></span></span><span class="line"><span class="cl"><span class="s1">    &#34;manufacturer&#34;: &#34;Siemens&#34;,
</span></span></span><span class="line"><span class="cl"><span class="s1">    &#34;discounted&#34;: true
</span></span></span><span class="line"><span class="cl"><span class="s1">  }
</span></span></span><span class="line"><span class="cl"><span class="s1">}&#39;</span><span class="p">)</span><span class="w">
</span></span></span></code></pre></div><h1 id="select-value-from-json">Select value from JSON</h1>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">select</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="n">properties</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="s1">&#39;price&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="n">properties</span><span class="w"> </span><span class="o">-&gt;&gt;</span><span class="w"> </span><span class="s1">&#39;price&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">from</span><span class="w"> </span><span class="n">article</span><span class="w">
</span></span></span></code></pre></div><ul>
<li><code>-&gt;</code> will extract the value as JSONB</li>
<li><code>-&gt;&gt;</code> will extract the value as text</li>
</ul>
<h1 id="compare-values">Compare values</h1>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w"> </span><span class="o">*</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">FROM</span><span class="w"> </span><span class="n">article</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">WHERE</span><span class="w"> </span><span class="k">CAST</span><span class="p">(</span><span class="n">properties</span><span class="w"> </span><span class="o">-&gt;&gt;</span><span class="w"> </span><span class="s1">&#39;price&#39;</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="nb">NUMERIC</span><span class="p">)</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="mi">10</span><span class="w">
</span></span></span></code></pre></div><h1 id="check-where-value-is-contained">Check where value is contained</h1>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w"> </span><span class="o">*</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">FROM</span><span class="w"> </span><span class="n">article</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">WHERE</span><span class="w"> </span><span class="n">properties</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="s1">&#39;tags&#39;</span><span class="w"> </span><span class="o">?</span><span class="w"> </span><span class="s1">&#39;discounted&#39;</span><span class="w">
</span></span></span></code></pre></div><p>or</p>]]></description></item></channel></rss>