<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: ERINFOLAMI PETER</title>
    <description>The latest articles on DEV Community by ERINFOLAMI PETER (@dshady-programmer).</description>
    <link>https://dev.to/dshady-programmer</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1058235%2F0900771d-460f-416f-80e4-7541e31f74ee.png</url>
      <title>DEV Community: ERINFOLAMI PETER</title>
      <link>https://dev.to/dshady-programmer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dshady-programmer"/>
    <language>en</language>
    <item>
      <title>I Got Tired of Building Chat From Scratch in Django, So I Made a Package</title>
      <dc:creator>ERINFOLAMI PETER</dc:creator>
      <pubDate>Fri, 13 Mar 2026 04:44:10 +0000</pubDate>
      <link>https://dev.to/dshady-programmer/i-got-tired-of-building-chat-from-scratch-in-django-so-i-made-a-package-4k2n</link>
      <guid>https://dev.to/dshady-programmer/i-got-tired-of-building-chat-from-scratch-in-django-so-i-made-a-package-4k2n</guid>
      <description>&lt;p&gt;Every few months I'd end up in the same situation. New project, new client, same request: "can we add a chat feature?"&lt;/p&gt;

&lt;p&gt;And every time, I'd spend days wiring up Django Channels, designing room models, figuring out how to track delivery, handle permissions, support multiple devices... all before writing a single line of actual product code.&lt;/p&gt;

&lt;p&gt;So I finally built something to fix that.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gap I kept running into
&lt;/h2&gt;

&lt;p&gt;Django Channels is great but it's low level. It gives you WebSocket support and channel layers. What it doesn't give you is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Room management (and different room types: one-to-one, group, and broadcast)&lt;/li&gt;
&lt;li&gt;Message delivery and read receipts&lt;/li&gt;
&lt;li&gt;Reactions, replies, and forwards&lt;/li&gt;
&lt;li&gt;Object-level permissions for admins and moderators&lt;/li&gt;
&lt;li&gt;Multi-device session support&lt;/li&gt;
&lt;li&gt;Notification tracking for offline users&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every project I worked on needed all of these. Every project built them differently. None of them were quite right.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;django-realtime-chat-messaging&lt;/strong&gt; is a drop-in Django package that gives you a full WebSocket chat system with one endpoint, a clean event protocol, and enough flexibility to customize without rewriting everything.&lt;/p&gt;

&lt;p&gt;Connecting from the frontend looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ws&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;WebSocket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ws://localhost:8000/messaging/?token=YOUR_TOKEN&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;event_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;message.send&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;room_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;your-room-uuid&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Finally, chat that just works.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One connection. Everything flows through it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's included
&lt;/h2&gt;

&lt;p&gt;Out of the box you get three room types (&lt;code&gt;OneToOneChat&lt;/code&gt;, &lt;code&gt;GroupChat&lt;/code&gt;, &lt;code&gt;Channel&lt;/code&gt;) backed by a polymorphic &lt;code&gt;Room&lt;/code&gt; table, full message lifecycle (create, reply, forward, edit, soft/hard delete), read receipts, delivery tracking, reactions, multi-device sessions, and object-level permissions via &lt;code&gt;django-guardian&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;There's also a notification scaffolding layer. The package tracks unread messages per user and dispatches them when the user connects. You plug in your own push provider. The package stays out of that.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part I spent the most time on
&lt;/h2&gt;

&lt;p&gt;Everything is swappable. Models, serializers, event handlers, permission handlers, even the consumer class and the WebSocket URL path are all configurable via settings.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;REALTIME_CHAT_MESSAGING&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CHAT_CONSUMER_CLASS&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;myapp.consumers.CustomChatConsumer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EVENT_HANDLER_CLASS&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;myapp.handlers.CustomEventHandler&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;WEBSOCKET_PATH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;chat/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can use it with zero config and have something working in under an hour, or you can swap out specific pieces as your needs grow. Nothing requires you to fork the package.&lt;/p&gt;

&lt;h2&gt;
  
  
  This is v0.1.0
&lt;/h2&gt;

&lt;p&gt;First public release. The core is solid but I'm sure there are rough edges I haven't hit yet.&lt;/p&gt;

&lt;p&gt;If you're a Django developer who has built chat before, I'd really value your take on the design decisions. If you're newer to WebSockets and want a real project to learn from, this might be a good one to dig into.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pypi.org/project/django-realtime-chat-messaging/" rel="noopener noreferrer"&gt;PyPI&lt;/a&gt;: &lt;code&gt;pip install django-realtime-chat-messaging&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://django-realtime-chat-messaging.readthedocs.io" rel="noopener noreferrer"&gt;Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dshady-programmer/django-realtime-chat-messaging" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy to answer questions in the comments.&lt;/p&gt;

</description>
      <category>django</category>
      <category>python</category>
      <category>websocket</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Basic Ansible tutorial (Installation and setup)</title>
      <dc:creator>ERINFOLAMI PETER</dc:creator>
      <pubDate>Mon, 31 Jul 2023 20:47:59 +0000</pubDate>
      <link>https://dev.to/dshady-programmer/basic-ansible-tutorial-installation-and-setup-2jcn</link>
      <guid>https://dev.to/dshady-programmer/basic-ansible-tutorial-installation-and-setup-2jcn</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In the last article we talked about the power of ansible, it's importance and why you should consider using it in your company or on your next big project if you haven't been using it. Ansible is a configuration management tool that streamlines the process of controlling large number of servers. Ansible is just one of the other configuration tool out there, some of which includes &lt;a href="https://puppet.com/" rel="noopener noreferrer"&gt;puppet&lt;/a&gt;, &lt;a href="https://www.chef.io/" rel="noopener noreferrer"&gt;chef&lt;/a&gt;.&lt;br&gt;
In this tutorial we’ll discuss how to install Ansible on your machine (for this tutorial we'll be using a linux environment, ubuntu) and go over some basics of how to use this software.&lt;/p&gt;
&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before installing ansible you must have &lt;strong&gt;An Ansible Control Node&lt;/strong&gt; which is the machine we'll install ansible on to configure other servers. The machine should have a non-root user with sudo privileges.&lt;/p&gt;
&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;p&gt;To install on ubuntu machine add the project official's PPA&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt-add-repository ppa:ansible/ansible
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then update&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install ansible&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install ansible
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also install ansible via python (This works for any OS).&lt;/p&gt;

&lt;p&gt;Make sure you have python installed on your machine then run the following to install ansible&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python3 -m pip install --user ansible
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use &lt;code&gt;python&lt;/code&gt; for windows.&lt;/p&gt;

&lt;p&gt;We've successfully installed ansible on our machine&lt;/p&gt;

&lt;h2&gt;
  
  
  Using ansible
&lt;/h2&gt;

&lt;p&gt;Now let's use ansible!, one of the simplest way is first by creating an &lt;code&gt;inventory&lt;/code&gt; file in your working directory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;touch inventory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;in the &lt;code&gt;inventory&lt;/code&gt; file, write the ip address or the domain name of the ansible hosts (machines you want to remotely access). For testing purposes you can input the ip address of your current machine with no space or just &lt;code&gt;localhost&lt;/code&gt;.&lt;br&gt;
&lt;strong&gt;NOTE&lt;/strong&gt;: The ansible hosts(machines ansible want to run commands remotely) must accept ssh connection and also must have set up the required ssh key, if you are using your local machine as the ansible host for testing purposes, you might need to add the public key of your machine to &lt;code&gt;authorized_keys&lt;/code&gt; so ssh via identity-file can work&lt;/p&gt;

&lt;p&gt;Then Run&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ceejay@ceejay:~/ceejay/ansible_practice$ ansible all --key-file ~/.ssh/id_rsa -i inventory -m ping

localhost | SUCCESS =&amp;gt; {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python3"

    },

    "changed": false,

    "ping": "pong"

}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;-i&lt;/code&gt; - accepts the inventory file.&lt;br&gt;
&lt;code&gt;-m&lt;/code&gt; - The ansible module to use. There a lot of ansible modules, you can check them &lt;a href="https://docs.ansible.com/ansible/2.9/modules/list_of_all_modules.html" rel="noopener noreferrer"&gt;here&lt;/a&gt;. The ping module is basically just to test if ansible is able to ssh into the server.&lt;/p&gt;

&lt;p&gt;You can also create an ansible config file &lt;code&gt;ansible.cfg&lt;/code&gt; to define the basic configurations. Create this file in your working directory, this would override the default config file in &lt;code&gt;/etc/ansible&lt;/code&gt;. &lt;br&gt;
in the &lt;code&gt;ansible.cfg&lt;/code&gt; file copy paste the following&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[defaults]

inventory = inventory

private_key_file = ~/.ssh/id_rsa

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save this file and run&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ceejay@ceejay:~/ceejay/ansible_practice$ ansible all -m ping

localhost | SUCCESS =&amp;gt; {

    "ansible_facts": {

        "discovered_interpreter_python": "/usr/bin/python3"

    },

    "changed": false,

    "ping": "pong"

}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This method makes it cleaner and easier to run.&lt;/p&gt;

&lt;p&gt;We've just seen how to use ansible, in the coming article we'll explore more possibilities with ansible, there's so much more powerful stuffs you can do with ansible.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>AUTOMATING WITH ANSIBLE (CONFIGURATION TOOL)</title>
      <dc:creator>ERINFOLAMI PETER</dc:creator>
      <pubDate>Fri, 28 Jul 2023 18:55:54 +0000</pubDate>
      <link>https://dev.to/dshady-programmer/automating-with-ansible-configuration-tool-4il8</link>
      <guid>https://dev.to/dshady-programmer/automating-with-ansible-configuration-tool-4il8</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In the rapidly evolving world of IT infrastructure management, efficiency, scalability, and automation have become critical factors for organizations to stay competitive. Traditional manual processes for provisioning and managing servers, particularly in the context of multiple database servers and enterprise databases, are not only time-consuming but also error-prone, leading to potential downtimes and security risks. This is where ansible comes in, it's an open source automation tool which solves the aforementioned issues.&lt;/p&gt;

&lt;p&gt;Ansible simplifies and streamlines the process of managing complex IT environments by providing a robust, agentless, and declarative approach to configuration management, application deployment, and task automation. It has gained widespread popularity among system administrators, developers, and DevOps teams for its ability to orchestrate and automate repetitive tasks, such as server provisioning and database deployment, across a wide range of platforms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Perks of utilizing ansible.
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Simplified Automation:&lt;/strong&gt; Ansible allows it users to define infrastructure as code using a simple, human-readable language known as YAML. This approach makes automation more accessible to both developers and system administrators, enabling them to easily describe the desired state of their database servers and manage them efficiently. You simply just write code for what should have been manually "ssh-ing" into 10-100 of servers manually and configuring them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Agentless Architecture:&lt;/strong&gt; Unlike many other automation tools, Ansible follows an agentless architecture, which means it doesn't require any additional software to be installed on the target servers. This minimizes the management overhead and security concerns associated with agents and simplifies the setup process for database servers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Idempotent Execution:&lt;/strong&gt; Ansible executes tasks in an idempotent manner, ensuring that the same configuration is applied consistently, regardless of the server's current state. This feature eliminates configuration drift and ensures that databases are provisioned consistently across the entire infrastructure. But you might be wondering isn't that too rigid? well, ansible also offers you the flexibility of applying specific changes to specific servers, based on different criterias which may include server roles(web server, file server, workstations, etc..), underlying operating system(centOS, ubuntu, windows, etc..) , conditions (updated, changed, present, etc..), etc...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Reusability and Modularity:&lt;/strong&gt; Ansible promotes the use of roles and playbooks, which are reusable and modular components that encapsulate specific configurations and tasks. This allows teams to standardize the provisioning process, share best practices, and enhance collaboration across different projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Integration with Existing Tools:&lt;/strong&gt; Ansible integrates seamlessly with various configuration management tools, cloud providers, and other DevOps technologies. This adaptability enables organizations to leverage their existing investments and incorporate Ansible into their existing workflows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Scalability and Flexibility:&lt;/strong&gt; Whether you need to provision a handful of database servers or manage a large-scale enterprise database environment, Ansible can scale to meet your needs. Its agentless nature and parallel execution capabilities make it well-suited for handling distributed and complex infrastructures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Community and Ecosystem:&lt;/strong&gt; Ansible boasts a vibrant and active community that continuously contributes to the development of modules and playbooks. This extensive ecosystem provides access to pre-built automation solutions for various databases, making it easier for teams to get started and accelerate their automation efforts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;By just pressing the "Enter" key you can deploy applications on hundreds to thousands of servers within seconds to minutes with guaranteed consistency across these servers. As said earlier provisioning infrastructures just by writing code (IAC - Infrastructure As Code) has made deployment automation easier, faster, and scalable. In the coming article we'll see how to install ansible and using it at the bearest minimum.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>INTRODUCTION TO POSTGRES DEPLOYMENT (edb-deployment) TOOL (PART 2)</title>
      <dc:creator>ERINFOLAMI PETER</dc:creator>
      <pubDate>Sat, 15 Jul 2023 14:36:11 +0000</pubDate>
      <link>https://dev.to/dshady-programmer/introduction-to-postgres-deployment-edb-deployment-tool-part-2-56m3</link>
      <guid>https://dev.to/dshady-programmer/introduction-to-postgres-deployment-edb-deployment-tool-part-2-56m3</guid>
      <description>&lt;h2&gt;
  
  
  INTRODUCTION
&lt;/h2&gt;

&lt;p&gt;In the last &lt;a href="https://dev.to/shadycj/introduction-to-postgres-deployment-edb-deployment-tool-part-1-4pd0"&gt;article&lt;/a&gt; we talked about the edb-deployment tool, what it does, how to install and setup. In this article we'll see how to use this tool to deploy our PostgreSQL/EDB Postgres Advanced Server. &lt;/p&gt;

&lt;h3&gt;
  
  
  TOOL USAGE
&lt;/h3&gt;

&lt;p&gt;This article would assume you've installed this tool. To deploy your project using edb-deployment tool there are 5 steps: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Configuring your cloud credentials&lt;/strong&gt;: &lt;/p&gt;

&lt;p&gt;This configuration depends on the cloud vendor (aws, gcloud, azure) being used. First you make sure the cloud vendor cli tool has been installed, and if you already installed using the &lt;code&gt;setup&lt;/code&gt; command from &lt;code&gt;edb-deployment&lt;/code&gt; then you need to update the &lt;code&gt;PATH&lt;/code&gt; environment variable using&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ export PATH=$PATH:$HOME/.edb-cloud-tools/bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You might want to add this line of code in an config init file like &lt;code&gt;.bashrc&lt;/code&gt; for linux users. Then you can go ahead and configure your credentials according to the cloud vendor you intend to use. For aws you use the following command &lt;code&gt;aws configure&lt;/code&gt;. You can look up other cloud vendors way of configuring &lt;a href="https://github.com/EnterpriseDB/postgres-deployment/tree/master#configure-cloud-credentials" rel="noopener noreferrer"&gt;here&lt;/a&gt;. You might also need to be conversant with using this cloud vendor cli tool and their services to setup your credentials correctly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Configuring your project&lt;/strong&gt;: &lt;br&gt;
After setting up your cloud credentials and you are logged in then you go on to configure your project. &lt;code&gt;edb-deployment&lt;/code&gt; gives you default configuration values relative to your cloud vendor. Configuration values like &lt;strong&gt;instance type&lt;/strong&gt;, &lt;strong&gt;disk size&lt;/strong&gt;, &lt;strong&gt;OS image&lt;/strong&gt;, &lt;strong&gt;additional volumes&lt;/strong&gt;, etc. To change the default values from edb you'll need to dump those values in a json file because it's in json format then you can edit this file to fill in the parameters. Here's the command to run to dump the default values&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;edb-deployment &amp;lt;CLOUD_VENDOR&amp;gt; specs &amp;gt; my_configuration.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;like i said the configuration values differs based on your cloud vendor. And if you are deploying on bare-metal server (where you need to configure the ip address yourself and other configurations) use the following command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ edb-deployment baremetal specs --reference-architecture EDB-RA-1 &amp;gt; baremetal-edb-ra-1.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The reference architectures types would be talked about in a bit.&lt;/strong&gt;&lt;br&gt;
Then you can edit the configuration files to suit your need.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Initializing your project:&lt;/strong&gt; &lt;br&gt;
After successfully creating your configuration file, you'll need to create your project from which you'll then deploy. In the last article the different sub commands provided by the &lt;code&gt;edb-deployment&lt;/code&gt; tool was iterated and we'll be using one of those subcommands to initialize a new project. The &lt;code&gt;configure&lt;/code&gt; command is used to initialize a new project and here is how to use it with the necessary flags required to succesfully create the project&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;edb-deployment &amp;lt;CLOUD_VENDOR&amp;gt; configure &amp;lt;PROJECT_NAME&amp;gt; \
  -a &amp;lt;REFERENCE_ARCHITECTURE_CODE&amp;gt; \
  -o &amp;lt;OPERATING_SYSTEM&amp;gt; \
  -t &amp;lt;PG_ENGINE_TYPE&amp;gt; \
  -v &amp;lt;PG_VERSION&amp;gt; \
  -u "&amp;lt;EDB_REPO_USERNAME&amp;gt;:&amp;lt;EDB_REPO_PASSWORD&amp;gt;" \
  -r &amp;lt;CLOUD_REGION&amp;gt; \
  -s my_configuration.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;PROJECT_NAME&lt;/code&gt;: Your project name.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;REFERENCE_ARCHITECTURE_CODE&lt;/code&gt;: Reference architecture code name. Here are the allowed values: &lt;code&gt;EDB-RA-1&lt;/code&gt; for a single Postgres node deployment with one backup server and one PEM monitoring server, &lt;code&gt;EDB-RA-2&lt;/code&gt; for a 3 Postgres nodes deployment with quorum base synchronous replication and automatic failover, one backup server and one PEM monitoring server, &lt;code&gt;EDB-RA-3&lt;/code&gt; for extending &lt;code&gt;EDB-RA-2&lt;/code&gt; with 3 PgPoolII nodes, and HammerDB-TPROC-C for setting up a 2-tier configuration for benchmarking with an OLTP workload. Default: &lt;code&gt;EDB-RA-1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;OPERATING_SYSTEM&lt;/code&gt;: Operating system. Allowed values are: &lt;code&gt;CentOS7&lt;/code&gt;, &lt;code&gt;RockyLinux8&lt;/code&gt;, &lt;code&gt;RedHat7&lt;/code&gt; and &lt;code&gt;RedHat8&lt;/code&gt;. Default: &lt;code&gt;RockyLinux8&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;PG_ENGINE_TYPE&lt;/code&gt;: Postgres engine type. Allowed values are: &lt;code&gt;PG&lt;/code&gt; for PostgreSQL, &lt;code&gt;EPAS&lt;/code&gt; for EDB Postgres Advanced Server. Default: &lt;code&gt;PG&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;PG_VERSION&lt;/code&gt;: PostgreSQL or EPAS version. Allowed values are: &lt;code&gt;11&lt;/code&gt;, &lt;code&gt;12&lt;/code&gt;, &lt;code&gt;13&lt;/code&gt; and &lt;code&gt;14&lt;/code&gt;. Default: &lt;code&gt;14&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;"EDB_REPO_USERNAME:EDB_REPO_PASSWORD"&lt;/code&gt;: EDB Packages repository credentials. (The edb package project in which you wish to deploy repo name and password). It is Required.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CLOUD_REGION&lt;/code&gt;: Cloud vendor region. Default value depends on Cloud vendor.&lt;/p&gt;

&lt;p&gt;You can use the help command to see the full options&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;edb-deployment &amp;lt;CLOUD_VENDOR&amp;gt; configure --help
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Provisioning the Cloud Resource:&lt;/strong&gt;&lt;br&gt;
Before deploying the project you'll need to provision the cloud resources, which is seemingly intuitive that when you want to deploy your project on any cloud provider, you'll need to first provision the servers and other resources(volumes, etc..) before deploying your project. Same functionality is provided with the &lt;code&gt;edb-deployment&lt;/code&gt; tool, you can provision your resources using the following command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ edb-deployment &amp;lt;CLOUD_VENDOR&amp;gt; provision &amp;lt;PROJECT_NAME&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;5. Deployment&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;To deploy the project, use the &lt;code&gt;deploy&lt;/code&gt; subcommand&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ edb-deployment &amp;lt;CLOUD_VENDOR&amp;gt; deploy &amp;lt;PROJECT_NAME&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  CONCLUSION
&lt;/h3&gt;

&lt;p&gt;We've seen how to deploy edb projects using the &lt;strong&gt;edb-deployment&lt;/strong&gt; tool, Here is the official &lt;a href="https://github.com/EnterpriseDB/postgres-deployment/tree/master" rel="noopener noreferrer"&gt;repo&lt;/a&gt; to the project feel free to visit, read more and raise issues if you encounter any!. &lt;/p&gt;

</description>
      <category>postgres</category>
    </item>
    <item>
      <title>INTRODUCTION TO POSTGRES DEPLOYMENT (edb-deployment) TOOL (PART 1)</title>
      <dc:creator>ERINFOLAMI PETER</dc:creator>
      <pubDate>Fri, 14 Jul 2023 14:47:22 +0000</pubDate>
      <link>https://dev.to/dshady-programmer/introduction-to-postgres-deployment-edb-deployment-tool-part-1-4pd0</link>
      <guid>https://dev.to/dshady-programmer/introduction-to-postgres-deployment-edb-deployment-tool-part-1-4pd0</guid>
      <description>&lt;h2&gt;
  
  
  INTRODUCTION
&lt;/h2&gt;

&lt;p&gt;You might be wondering what is &lt;strong&gt;edb-deployment&lt;/strong&gt;, well &lt;a href="https://github.com/EnterpriseDB/postgres-deployment/tree/master" rel="noopener noreferrer"&gt;&lt;strong&gt;edb-deployment&lt;/strong&gt;&lt;/a&gt; is a tool that gives you the superpower of provisioning cloud resources (like instances, bare-metal servers)  in order to deploy your PostgreSQL servers and other tools for monitoring, backup/recovery, high availability etc... on popular cloud providers. The mainly supported cloud providers are &lt;strong&gt;AWS&lt;/strong&gt;, &lt;strong&gt;Azure&lt;/strong&gt;, &lt;strong&gt;GCP&lt;/strong&gt;. It also allows you deploy reference architectures which is reliable and saves you the time and headache of designing a suitable architecture for your resources. Some of the reference architectures supported by edb can be found &lt;a href="https://github.com/EnterpriseDB/edb-ref-archs/blob/main/edb-reference-architecture-codes/README.md" rel="noopener noreferrer"&gt;here&lt;/a&gt;. Edb-deployment pretty much does the heavy-lifting for you by just typing in the right commands on your command line.&lt;/p&gt;

&lt;h3&gt;
  
  
  PRE-REQUISITE
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;edb-deployment&lt;/strong&gt; is a tool built on python, so to use this tool you need to have python3 and pip3 installed. You also need to install the cloud vendor cli tool(aws cli, azure cli, google cloud sdk) you intend to deploy on and any other additional deployment tools such as &lt;strong&gt;teraform&lt;/strong&gt;, &lt;strong&gt;ansible&lt;/strong&gt;. The basic pre-requisites here are python3 and pip3, you can pretty much install the other cli tools by running a setup command which we'll see in a bit.&lt;/p&gt;

&lt;h3&gt;
  
  
  HOW TO INSTALL
&lt;/h3&gt;

&lt;p&gt;You can easily install through pip from pypi using the following command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ pip3 install edb-deployment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And on a linux device make sure to use the sudo privileges (preferable)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo pip3 install edb-deployment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And you can also install direcly from the source code, but make sure you have git installed on your machine. To install run the following (assuming you already have github ssh setup)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git clone git@github.com:EnterpriseDB/postgres-deployment.git
$ cd postgres-deployment
$ sudo pip3 install . --upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To confirm installation you can run the following command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ edb-deployment --version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also enable command auto completion (this functionality allows you to type commands halfway and complete them with the &lt;strong&gt;tab&lt;/strong&gt; key). This functionality of edb-deployment tool only works for linux shells(bash, ksh). Run the command to enable auto-completion&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ eval "$(register-python-argcomplete edb-deployment)"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After installation you might need to install cloud cli tool in which you intend on deploy with, for example if you need to deploy in aws you'll need the aws cli tool installed. To install the specific cli tool using edb make sure to have to following installed:&lt;br&gt;
&lt;code&gt;gcc&lt;/code&gt; (Linux only)&lt;br&gt;
&lt;code&gt;python3-devel&lt;/code&gt; (Linux only)&lt;br&gt;
&lt;code&gt;unzip&lt;/code&gt;&lt;br&gt;
&lt;code&gt;wget&lt;/code&gt;&lt;br&gt;
&lt;code&gt;tar&lt;/code&gt;&lt;br&gt;
These packages should be installed through usual package manager (dnf, apt, brew, etc..). Also for debian machines install &lt;code&gt;libffi-dev&lt;/code&gt;.&lt;br&gt;
Having met the requirements you also need to install virtualenv(if not already installed) from pip, to allow creation of virtual environments.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo pip3 install virtualenv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run the following to install the necessary cloud vendor cli tools&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;edb-deployment &amp;lt;CLOUD_VENDOR&amp;gt; setup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CLOUD_VENDOR: &lt;code&gt;aws&lt;/code&gt;, &lt;code&gt;terraform&lt;/code&gt;, &lt;code&gt;ansible&lt;/code&gt;, &lt;code&gt;gcloud&lt;/code&gt;, &lt;code&gt;azure&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  USAGE
&lt;/h3&gt;

&lt;p&gt;Basic usage of this tool is straight forward. The format is&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ edb-deployment &amp;lt;CLOUD_VENDOR&amp;gt; &amp;lt;SUB_COMMAND&amp;gt; [&amp;lt;PROJECT_NAME&amp;gt;]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The supported cloud vendor are:&lt;br&gt;
&lt;code&gt;aws&lt;/code&gt;: Amazon Web Services&lt;br&gt;
&lt;code&gt;aws-pot&lt;/code&gt;: EDB POT (Proof Of Technology) on AWS Cloud&lt;br&gt;
&lt;code&gt;aws-rds&lt;/code&gt;: Amazon Web Services RDS for PostgreSQL&lt;br&gt;
&lt;code&gt;aws-rds-aurora&lt;/code&gt;: Amazon Aurora&lt;br&gt;
&lt;code&gt;azure&lt;/code&gt;: Microsoft Azure Cloud&lt;br&gt;
&lt;code&gt;azure-pot&lt;/code&gt;: EDB POT (Proof Of Technology) on Azure Cloud&lt;br&gt;
&lt;code&gt;azure-db&lt;/code&gt;: Microsoft Azure Database&lt;br&gt;
&lt;code&gt;gcloud&lt;/code&gt;: Google Cloud&lt;br&gt;
&lt;code&gt;gcloud-pot&lt;/code&gt;: EDB POT (Proof Of Technology) on Google Cloud&lt;br&gt;
&lt;code&gt;gcloud-sql&lt;/code&gt;: Google Cloud SQL for PostgreSQL&lt;/p&gt;

&lt;p&gt;The valid sub commands you can use includes:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;configure&lt;/code&gt;: New project initialization and configuration&lt;br&gt;
&lt;code&gt;provision&lt;/code&gt;: Cloud resources provisioning&lt;br&gt;
&lt;code&gt;destroy&lt;/code&gt;: Cloud resources destruction&lt;br&gt;
&lt;code&gt;deploy&lt;/code&gt;: Postgres and tools deployment&lt;br&gt;
&lt;code&gt;show&lt;/code&gt;: Show configuration&lt;br&gt;
&lt;code&gt;display&lt;/code&gt;: Display project inventory&lt;br&gt;
&lt;code&gt;passwords&lt;/code&gt;: Display project passwords&lt;br&gt;
&lt;code&gt;list&lt;/code&gt;: List projects&lt;br&gt;
&lt;code&gt;specs&lt;/code&gt;: Show Cloud Vendor default specifications&lt;br&gt;
&lt;code&gt;logs&lt;/code&gt;: Show project logs&lt;br&gt;
&lt;code&gt;remove&lt;/code&gt;: Remove project&lt;/p&gt;

&lt;h3&gt;
  
  
  CONCLUSION
&lt;/h3&gt;

&lt;p&gt;With this basic installation and setup we can start provisioning servers and deploying our resources using different architectures on the cloud. In the next parts I'll walk you through on how to use this tool to deploy on cloud providers(e.g aws) with the basic syntax we've seen in this article. &lt;/p&gt;

</description>
    </item>
    <item>
      <title>APACHE AGE: Getting Started Part 4(AGE Query Formats)</title>
      <dc:creator>ERINFOLAMI PETER</dc:creator>
      <pubDate>Mon, 26 Jun 2023 19:32:02 +0000</pubDate>
      <link>https://dev.to/dshady-programmer/apache-age-getting-started-part-4age-query-formats-gd5</link>
      <guid>https://dev.to/dshady-programmer/apache-age-getting-started-part-4age-query-formats-gd5</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;We've seen the various ways we can install the apache age extension on our local machine. Now we need to understand the query format used in age, how to create a graph and delete a graph.&lt;/p&gt;

&lt;h2&gt;
  
  
  Query Format
&lt;/h2&gt;

&lt;p&gt;AGE uses the format &lt;code&gt;cypher(graph_name, query_string, parameters)&lt;/code&gt;. The cypher() function is a function in the &lt;code&gt;ag_catalog&lt;/code&gt; (&lt;code&gt;ag_catalog&lt;/code&gt; is a schema that is loaded when you LOAD 'age') that returns a postgres SETOF records. As seen, the cypher() function takes in 3 arguments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;graph_name:&lt;/strong&gt; Basically the name of the graph in the database (that has already been created) that you want to work on. We'll see how to create a graph and delete a graph in a minute&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;query_string:&lt;/strong&gt; This takes a string of queries that allows you to perform operations on the graph. This string of queries is a special type of language called &lt;strong&gt;Cypher Query Language&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;parameters:&lt;/strong&gt; An optional map of parameters used for Prepared Statements. Default is NULL.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Creating and Deleting graphs
&lt;/h2&gt;

&lt;p&gt;To use a graph_name in the cypher() function we talked about above we need to first create a graph. Creating a graph simply creates a schema in the database in which all the graph objects(vertices, edges, labels etc...) are stored.&lt;/p&gt;

&lt;p&gt;To create a graph we use the &lt;code&gt;create_graph()&lt;/code&gt; function from the &lt;code&gt;ag_catalog&lt;/code&gt; schema/namespace which takes an argument which is the &lt;code&gt;graph_name&lt;/code&gt;, this creates a schema with the &lt;code&gt;graph_name&lt;/code&gt; and also some boiler plates objects in the created schema. Deleting a graph simply requires using the function &lt;code&gt;drop_graph()&lt;/code&gt; also defined in the &lt;code&gt;ag_catalog&lt;/code&gt;, which takes 2 arguments: graph_name, cascade.&lt;br&gt;
The cascade argument takes a boolean value of either true or false on whether to delete labels and data that depends on the graph. According to the docs it's recommended to keep this as true.&lt;/p&gt;

&lt;p&gt;Now let's create our first graph.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Listing out the schemas/namespace present in the database&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;postgresDB=# SELECT schema_name

postgresDB-# FROM information_schema.schemata;

    schema_name     

--------------------

 ag_catalog

 information_schema

 public

 pg_catalog

 pg_toast_temp_1

 pg_temp_1

 pg_toast

(7 rows)


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here we see &lt;code&gt;ag_catalog&lt;/code&gt; is present, &lt;code&gt;ag_catalog&lt;/code&gt; is the namespace in which all the main age functions are stored. So to use any of the above function we'll need to make sure &lt;code&gt;ag_catalog&lt;/code&gt; is present.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Creating a graph&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To create a graph &lt;code&gt;test_graph&lt;/code&gt; we'll run the query &lt;code&gt;SELECT * FROM ag_catalog.create_graph('test_graph')&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;postgresDB=# SELECT * FROM ag_catalog.create_graph('test_graph');

NOTICE:  graph "test_graph" has been created

 create_graph 

--------------



(1 row)



postgresDB=# 


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Remember i said creating graph creates a namespace to store all the objects peculiar to the graph. To check if the graph was created we'll list our current shemas again.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;postgresDB=# SELECT schema_name                           

FROM information_schema.schemata;

    schema_name     

--------------------

 test_graph

 ag_catalog

 information_schema

 public

 pg_catalog

 pg_toast_temp_1

 pg_temp_1

 pg_toast

(8 rows)



postgresDB=# 


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we see that our graph has been created.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Deleting a graph&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Just like i said earlier, deleting a graph is as easy as simply calling the &lt;code&gt;drop_graph()&lt;/code&gt; function. But we'll be passing in the &lt;code&gt;true&lt;/code&gt; value for our second argument (cascade).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;postgresDB=# SELECT * FROM ag_catalog.drop_graph('test_graph', true);

NOTICE:  drop cascades to 2 other objects

DETAIL:  drop cascades to table test_graph._ag_label_vertex

drop cascades to table test_graph._ag_label_edge

NOTICE:  graph "test_graph" has been dropped

 drop_graph 

------------



(1 row)



postgresDB=# 


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we've deleted the &lt;code&gt;test_graph&lt;/code&gt;, notice how there are also other two objects deleted as a result of setting cascade to &lt;code&gt;true&lt;/code&gt;, if we didn't set it to &lt;code&gt;true&lt;/code&gt;, we'll have to manually delete those objects. &lt;/p&gt;

&lt;p&gt;Going back to our query format, the second arguments which is the &lt;code&gt;query_string&lt;/code&gt;  is usually embedded in a "$$" delimeter which is used to signify the beginning and end of the query. The last argument we won't worry to much about for now.&lt;/p&gt;

&lt;p&gt;The basic query format goes like this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT * FROM ag_catalog.cypher('graph_name', $$
 "cypher query goes here"
$$) as (result agtype);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We'll talk more about agtype and cypher query language in the coming articles in this series&lt;/p&gt;

&lt;p&gt;Now let's put all we've learned together and create a graph, run a simple query to return "hello world" on the graph and also delete the graph&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;postgresDB=# SELECT * FROM ag_catalog.create_graph('test_graph');

NOTICE:  graph "test_graph" has been created

 create_graph 

--------------



(1 row)

postgresDB=# SELECT * FROM ag_catalog.cypher('test_graph', $$

RETURN "Hello World"

$$) as (result ag_catalog.agtype);

    result     

---------------

 "Hello World"

(1 row)



postgresDB=# SELECT * FROM ag_catalog.drop_graph('test_graph', true);

NOTICE:  drop cascades to 2 other objects

DETAIL:  drop cascades to table test_graph._ag_label_vertex

drop cascades to table test_graph._ag_label_edge

NOTICE:  graph "test_graph" has been dropped

 drop_graph 

------------



(1 row)



postgresDB=# 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;appending &lt;code&gt;ag_catalog&lt;/code&gt; to every age function all the time can be pretty daunting, we can set the &lt;code&gt;search_path&lt;/code&gt; to include &lt;code&gt;ag_catalog&lt;/code&gt;, so by default it looks in the &lt;code&gt;ag_catalog&lt;/code&gt; when a function is called.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;postgresDB=# SET search_path = ag_catalog, "$user", public;

SET

postgresDB=# SELECT * FROM create_graph('test_graph');

NOTICE:  graph "test_graph" has been created

 create_graph 

--------------



(1 row)



postgresDB=# SELECT * FROM cypher('test_graph', $$

RETURN "Hello World"

$$) as (result agtype);

    result     

---------------

 "Hello World"

(1 row)



postgresDB=# SELECT * FROM drop_graph('test_graph', true);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This way is easier and cleaner.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;We've been able to see the basic query format in age including how to create a graph, what happens when you create a graph, running a basic query in the graph and how to delete a graph. It's important to note that while providing the &lt;code&gt;graph_name&lt;/code&gt; in any of the functions we've talked about today, graph name must be put in single quotes, double quotes might throw an error. In the coming articles we'll talk about different datatypes and cypher queries.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>APACHE AGE: Getting Started Part 3(AGE INSTALLATION VIA DOCKER)</title>
      <dc:creator>ERINFOLAMI PETER</dc:creator>
      <pubDate>Wed, 07 Jun 2023 20:50:07 +0000</pubDate>
      <link>https://dev.to/dshady-programmer/apache-age-getting-started-part-3age-installation-via-docker-2lig</link>
      <guid>https://dev.to/dshady-programmer/apache-age-getting-started-part-3age-installation-via-docker-2lig</guid>
      <description>&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;In the last article from the apache age series, we've been able to successfully install the apache age extension through installation directly from the source code on github. But you can also use the extension on your local machine through docker, this way you get to isolate the extension only on the docker container you spin up, and also wouldn't have to bother about barely installing a lot of dependencies on your local machine.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pre-requisite
&lt;/h3&gt;

&lt;p&gt;The pre-requisites remain the same which is having a compatible version(11) of postgreSQL installed (check &lt;a href="https://dev.to/shadycj/apache-age-getting-started-part-1posgresql-installation-4o5o"&gt;here&lt;/a&gt; for guide) and also having docker installed on your local machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; It's recommended to use a linux environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting up and Installation
&lt;/h3&gt;

&lt;p&gt;To install the age extension via docker is very easy. Once you have your pre-requisites installed follow this steps:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Pull the apache/age image from docker repository&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker pull apache/age
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This may take several minutes, based on your internet connectivity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Run the apache/age container&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run \
    --name myPostgresDb  \
    -p 5455:5432 \
    -e POSTGRES_USER=postgresUser \
    -e POSTGRES_PASSWORD=postgresPW \
    -e POSTGRES_DB=postgresDB \
    -d \
    apache/age
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can change the following names (myPostgresDb, postgresUser, postgresPW, postgresDB) to suit your preference but make sure you remember them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Confirm the container is running&lt;/strong&gt;&lt;br&gt;
After running the command in the previous steps leaving all the arguments as they are. I can now confirm my docker container is running&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ceejay@ceejay:~$ docker ps

CONTAINER ID   IMAGE        COMMAND                  CREATED         STATUS         PORTS                                       NAMES

6ea0a9f55c3e   apache/age   "docker-entrypoint.s…"   6 seconds ago   Up 4 seconds   0.0.0.0:5455-&amp;gt;5432/tcp, :::5455-&amp;gt;5432/tcp   myPostgresDb

ceejay@ceejay:~$ 

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Connect to the postgres cli running on the container&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ceejay@ceejay:~$ docker exec -it myPostgresDb bash

root@6ea0a9f55c3e:/# psql -d postgresDB -U postgresUser

psql (11.19 (Debian 11.19-1.pgdg100+1), server 11.13 (Debian 11.13-1.pgdg100+1))

Type "help" for help.



postgresDB=#
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;docker exec&lt;/code&gt; connects to the running container, and the &lt;code&gt;psql&lt;/code&gt; command connects to the postgres cli running on the container, the &lt;code&gt;-d&lt;/code&gt; flag allows you to specify the database name, and the &lt;code&gt;-U&lt;/code&gt; flags allows you to specify the username. &lt;br&gt;
&lt;strong&gt;note:&lt;/strong&gt; Remember to fill in the arguments according to what you set previously.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Load the Age extension&lt;/strong&gt;&lt;br&gt;
Now that we've successfully connected to the psql cli, we can now load in the age extension and also adding ag_catalog to search_path&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;postgresDB=# LOAD 'age';

LOAD

postgresDB=# SET search_path = ag_catalog, "$user", public;

SET

postgresDB=# 

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we can start creating our graphs and running cypher queries.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;With the aid of docker you can run the age extension in isolation, anytime you need to access the extension all you need to do is connect to the postgres cli on the container as shown earlier and run your queries. See you in the next episode!.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>PostgreSQL Tutorial: Creating Tables, Inserting and Basic Querying.</title>
      <dc:creator>ERINFOLAMI PETER</dc:creator>
      <pubDate>Sat, 29 Apr 2023 13:37:12 +0000</pubDate>
      <link>https://dev.to/dshady-programmer/postgresql-tutorial-creating-tables-inserting-and-basic-querying-2nph</link>
      <guid>https://dev.to/dshady-programmer/postgresql-tutorial-creating-tables-inserting-and-basic-querying-2nph</guid>
      <description>&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;PostgreSQL is an open-source object-relational database management system that provides a reliable, scalable, and secure platform for storing and managing structured data. PostgreSQL is known for its robustness, flexibility, and extensibility, which make it a popular choice for a wide range of applications, from small-scale web applications to large-scale enterprise systems. It supports a variety of data types, including numeric, character, date/time, and binary data, and offers advanced features such as support for transaction processing, multi-version concurrency control, and nested transactions.&lt;/p&gt;

&lt;p&gt;In this article i'll be demonstrating how you can create databases, and also creating tables in this database, as well as querying the table for data. To get started we need to login into the postgres server. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Connecting the server&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ceejay@ceejay:~$ psql

psql (12.14 (Ubuntu 12.14-1.pgdg22.04+1))

Type "help" for help.



ceejay=# 

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In case the above command doesn't work for you run the following command&lt;br&gt;
&lt;code&gt;sudo -u postgres psql&lt;/code&gt;. Then go ahead and create a user and grant the user required privileges.&lt;br&gt;
You can follow the guide in this article to create a new user &lt;a href="https://phoenixnap.com/kb/postgres-create-user" rel="noopener noreferrer"&gt;https://phoenixnap.com/kb/postgres-create-user&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Creating a database.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Currently these are the databases available. (Yours might be different)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ceejay=# \l

                             List of databases

   Name    |  Owner   | Encoding | Collate | Ctype |   Access privileges   

-----------+----------+----------+---------+-------+-----------------------

 ceejay    | ceejay   | UTF8     | en_NG   | en_NG | 

 postgres  | postgres | UTF8     | en_NG   | en_NG | 

 template0 | postgres | UTF8     | en_NG   | en_NG | =c/postgres          +

           |          |          |         |       | postgres=CTc/postgres

 template1 | postgres | UTF8     | en_NG   | en_NG | =c/postgres          +

           |          |          |         |       | postgres=CTc/postgres

 test      | postgres | UTF8     | en_NG   | en_NG | 

(5 rows)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now let's create a new database named &lt;code&gt;Record&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ceejay=# CREATE DATABASE Record;

CREATE DATABASE

ceejay=# \l

                             List of databases

   Name    |  Owner   | Encoding | Collate | Ctype |   Access privileges   

-----------+----------+----------+---------+-------+-----------------------

 ceejay    | ceejay   | UTF8     | en_NG   | en_NG | 

 postgres  | postgres | UTF8     | en_NG   | en_NG | 

 record    | ceejay   | UTF8     | en_NG   | en_NG | 

 template0 | postgres | UTF8     | en_NG   | en_NG | =c/postgres          +

           |          |          |         |       | postgres=CTc/postgres

 template1 | postgres | UTF8     | en_NG   | en_NG | =c/postgres          +

           |          |          |         |       | postgres=CTc/postgres

 test      | postgres | UTF8     | en_NG   | en_NG | 

(6 rows)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we've created a database. Next we connect to the database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Connect to the database&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ceejay=# \connect record

You are now connected to database "record" as user "ceejay".

record=# 

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We just connected to the record database. But before we start creating tables in postgresql databases there's what we call schemas. &lt;/p&gt;

&lt;p&gt;In PostgreSQL, a schema is a named logical container for database objects such as tables, indexes, views, and functions. Schemas are a way to organize and group database objects, and can be used to separate different applications or parts of an application that use the same database.&lt;/p&gt;

&lt;p&gt;Each schema in a PostgreSQL database is a namespace that contains a collection of database objects. Schemas allow you to logically separate database objects and organize them in a hierarchical structure, which makes it easier to manage the database and avoid naming conflicts between different objects.&lt;/p&gt;

&lt;p&gt;By default, PostgreSQL creates a schema named &lt;code&gt;public&lt;/code&gt; when you create a new database. However, you can create additional schemas as needed, and assign database objects to different schemas to organize them according to their purpose or ownership. This can help to improve security, as you can grant or revoke privileges on a per-schema basis, and control access to specific parts of the database.&lt;/p&gt;

&lt;p&gt;Maybe for personal practice it's not really important to create a personalized schema for your objects(Tables, functions, triggers...), But it's a good practice to always group your objects into schemas for production database. To check the schemas present in your current database.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;record=# \dn

  List of schemas

  Name  |  Owner   

--------+----------

 public | postgres

(1 row)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As said earlier the default schema for newly created databases is the &lt;code&gt;public&lt;/code&gt; schema. So if we don't specify a schema it just creates them in the &lt;code&gt;public&lt;/code&gt; namespace. For the sake of demonstration we'll be using the public schema. But if you need to create a schema and create let's say a table in that schema you can just work with the following commands in psql. &lt;/p&gt;

&lt;p&gt;create the schema.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE SCHEMA &amp;lt;schema_name&amp;gt;;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After creating the switch to the schema using&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SET search_path TO &amp;lt;schema_name&amp;gt;;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you can create tables. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Create Tables&lt;/strong&gt;&lt;br&gt;
Let's create a table &lt;code&gt;user_table&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;record=# CREATE TABLE user_table(

record(# id SERIAL PRIMARY KEY,

record(# first_name VARCHAR(20) NOT NULL,

record(# last_name VARCHAR(20) NOT NULL,

record(# age INTEGER NOT NULL,

record(# married BOOLEAN NOT NULL DEFAULT FALSE

record(# );

CREATE TABLE

record=# 

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We start by using the command &lt;code&gt;CREATE TABLE&lt;/code&gt; to create a table. The command is case insensitive (i.e you can use &lt;code&gt;create table&lt;/code&gt;)&lt;br&gt;
We the define the various fields which would serve as the column heading for the &lt;code&gt;user_table&lt;/code&gt;. The line &lt;code&gt;id SERIAL PRIMARY KEY&lt;/code&gt; simply means define a field name &lt;code&gt;id&lt;/code&gt; with data type of &lt;code&gt;SERIAL&lt;/code&gt; and a primary key constraint. There are different data types in postgreSQL you can read more on the official documentation &lt;a href="https://www.postgresql.org/docs/current/datatype.html" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;Serial&lt;/code&gt; datatype is an integer type(numbers) only that it'll auto-increment for every entry into the database. So you don't have to manually set it. The Primary Key constraint means this is going to be a unique field used to uniquely identify a row in the table. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;VARCHAR&lt;/code&gt; is simply for variable length character, and we set the max length for both the first name and last name to be &lt;code&gt;20&lt;/code&gt;. The &lt;code&gt;NOT NULL&lt;/code&gt; is a flag that simply means the field cannot be empty, which means when we add a new row in the table we cannot omit this field, there must be a set value. &lt;br&gt;
We can also have default values as seen in the &lt;code&gt;married&lt;/code&gt; field.&lt;/p&gt;

&lt;p&gt;There many more datatypes and constraints that you can use on tables, (e.g FOREIGN KEY, UNIQUE etc...) we won't go deep into those yet. &lt;/p&gt;

&lt;p&gt;Now that we've created a table let's insert data into the created table. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Insert Rows into the table&lt;/strong&gt;&lt;br&gt;
Let's insert few rows into our table.&lt;/p&gt;

&lt;p&gt;-&amp;gt; Inserting one row&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;record=# INSERT INTO user_table (first_name, last_name, age, married) VALUES ('John', 'Doe', 23, TRUE);

INSERT 0 1

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;-&amp;gt; We can insert multiple rows&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;record=# INSERT INTO user_table (first_name, last_name, age, married) VALUES ('chris', 'hemsworth', 32, TRUE), ('tom', 'hanks', 52, TRUE), ('Tom', 'holland', 23, FALSE), ('Jason', 'bourne', 33, FALSE);

INSERT 0 4

record=# 

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;-&amp;gt; Inserting while neglecting the married field (we allow postgres to set the default value).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;record=# INSERT INTO user_table (first_name, last_name, age) VALUES ('johnny', 'depp', 42);

INSERT 0 1

record=# 

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that we have some rows in our &lt;code&gt;user_table&lt;/code&gt; how do we get the rows ?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Basic Database Querying&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;-&amp;gt; To show all the fields of the rows inserted&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;record=# INSERT INTO user_table (first_name, last_name, age) VALUES ('johnny', 'depp', 42);

INSERT 0 1

record=# SELECT * FROM user_table;

 id | first_name | last_name | age | married 

----+------------+-----------+-----+---------

  1 | John       | Doe       |  23 | t

  2 | chris      | hemsworth |  32 | t

  3 | tom        | hanks     |  52 | t

  4 | Tom        | holland   |  23 | f

  5 | Jason      | bourne    |  33 | f

  6 | johnny     | depp      |  42 | f

(6 rows)



record=# 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Notice the how we didn't need to manually set the &lt;code&gt;id&lt;/code&gt; field while inserting and yet still present in the table.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;-&amp;gt; Get just the first_name and last_name&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;record=# SELECT first_name, last_name FROM user_table;

 first_name | last_name 

------------+-----------

 John       | Doe

 chris      | hemsworth

 tom        | hanks

 Tom        | holland

 Jason      | bourne

 johnny     | depp

(6 rows)



record=# 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;-&amp;gt; Changing the column header names to "FIRST NAME" and "LAST NAME"&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;record=# SELECT first_name AS "FIRST NAME", last_name AS "LAST NAME" FROM user_table;

 FIRST NAME | LAST NAME 

------------+-----------

 John       | Doe

 chris      | hemsworth

 tom        | hanks

 Tom        | holland

 Jason      | bourne

 johnny     | depp

(6 rows)



record=# 

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;-&amp;gt; Get the first 3 results&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;record=# SELECT first_name AS "FIRST NAME", last_name AS "LAST NAME" FROM user_table LIMIT 3;

 FIRST NAME | LAST NAME 

------------+-----------

 John       | Doe

 chris      | hemsworth

 tom        | hanks

(3 rows)



record=# 

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;-&amp;gt; Get rows where the first name is tom&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;record=# SELECT first_name AS "FIRST NAME", last_name AS "LAST NAME" FROM user_table WHERE first_name LIKE 'tom';

 FIRST NAME | LAST NAME 

------------+-----------

 tom        | hanks

(1 row)



record=# SELECT first_name AS "FIRST NAME", last_name AS "LAST NAME" FROM user_table WHERE first_name ILIKE 'tom';

 FIRST NAME | LAST NAME 

------------+-----------

 tom        | hanks

 Tom        | holland

(2 rows)



record=# 

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first query is case sensitive while the second is insensitive to the casing of the text.&lt;/p&gt;

&lt;p&gt;-&amp;gt; We can also order our outputs based on a different column, default is using the &lt;code&gt;id&lt;/code&gt; column, let's change this to the first_name.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;record=# SELECT * FROM user_table ORDER BY first_name;

 id | first_name | last_name | age | married 

----+------------+-----------+-----+---------

  2 | chris      | hemsworth |  32 | t

  5 | Jason      | bourne    |  33 | f

  1 | John       | Doe       |  23 | t

  6 | johnny     | depp      |  42 | f

  3 | tom        | hanks     |  52 | t

  4 | Tom        | holland   |  23 | f

(6 rows)



record=# 

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Creating, inserting, and querying a database can be as easy as those shown in this article and but can also get really complicated. But understanding the basics is the first step into becoming a pro at constructing a sophisticated table structure. Learn more about the different constraints, different table relationships, then delving more into how to make complex queries, aggregations, regex etc.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>APACHE AGE: Getting Started Part 2(AGE Installation)</title>
      <dc:creator>ERINFOLAMI PETER</dc:creator>
      <pubDate>Sat, 22 Apr 2023 18:15:09 +0000</pubDate>
      <link>https://dev.to/dshady-programmer/apache-age-getting-started-part-2age-installation-33ed</link>
      <guid>https://dev.to/dshady-programmer/apache-age-getting-started-part-2age-installation-33ed</guid>
      <description>&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;In this part of the series I'll be walking you through how to install the &lt;strong&gt;age&lt;/strong&gt; extension on top of the running instance of your postgres database. The pre-requisites to this installation is having postgres installed on your machine check &lt;a href="https://dev.to/shadycj/apache-age-getting-started-part-1posgresql-installation-4o5o"&gt;here&lt;/a&gt; for guide, and also you should have git installed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting up and installation
&lt;/h3&gt;

&lt;p&gt;Like i said in the previous article we'll be working with postgresql version 12, so we'll also try to install the version of &lt;strong&gt;AGE&lt;/strong&gt; that's compatible with postgres 12. Before we proceed to the installation there are various methods the age extension can be installed, first is via the github repo, second is downloading the source code directly from the release page, third is through the use of docker. We'll be installing via github.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. To get started we'll first clone the official apache github repository.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/apache/age.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. After cloning successfully cd into the directory and change into the PG12 release branch&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd age
git checkout release/PG12/1.1.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Run pg_config&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ceejay@ceejay:~$ pg_config

BINDIR = /usr/lib/postgresql/12/bin

DOCDIR = /usr/share/doc/postgresql-doc-12

HTMLDIR = /usr/share/doc/postgresql-doc-12

INCLUDEDIR = /usr/include/postgresql

PKGINCLUDEDIR = /usr/include/postgresql

INCLUDEDIR-SERVER = /usr/include/postgresql/12/server

LIBDIR = /usr/lib/x86_64-linux-gnu

PKGLIBDIR = /usr/lib/postgresql/12/lib

LOCALEDIR = /usr/share/locale

MANDIR = /usr/share/postgresql/12/man

SHAREDIR = /usr/share/postgresql/12

SYSCONFDIR = /etc/postgresql-common

PGXS = /usr/lib/postgresql/12/lib/pgxs/src/makefiles/pgxs.mk

CONFIGURE = '--build=x86_64-linux-gnu' '--prefix=/usr' '--includedir=/usr/include' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--sysconfdir=/etc' '--localstatedir=/var' '--disable-option-checking' '--disable-silent-rules' '--libdir=/usr/lib/x86_64-linux-gnu' '--runstatedir=/run' '--disable-maintainer-mode' '--disable-dependency-tracking' '--with-tcl' '--with-perl' '--with-python' '--with-pam' '--with-openssl' '--with-libxml' '--with-libxslt' '--mandir=/usr/share/postgresql/12/man' '--docdir=/usr/share/doc/postgresql-doc-12' '--sysconfdir=/etc/postgresql-common' '--datarootdir=/usr/share/' '--datadir=/usr/share/postgresql/12' '--bindir=/usr/lib/postgresql/12/bin' '--libdir=/usr/lib/x86_64-linux-gnu/' '--libexecdir=/usr/lib/postgresql/' '--includedir=/usr/include/postgresql/' '--with-extra-version= (Ubuntu 12.14-1.pgdg22.04+1)' '--enable-nls' '--enable-thread-safety' '--enable-debug' '--enable-dtrace' '--disable-rpath' '--with-uuid=e2fs' '--with-gnu-ld' '--with-gssapi' '--with-ldap' '--with-pgport=5432' '--with-system-tzdata=/usr/share/zoneinfo' 'AWK=mawk' 'MKDIR_P=/bin/mkdir -p' 'PROVE=/usr/bin/prove' 'PYTHON=/usr/bin/python3' 'TAR=/bin/tar' 'XSLTPROC=xsltproc --nonet' 'CFLAGS=-g -O2 -flto=auto -ffat-lto-objects -flto=auto -ffat-lto-objects -fstack-protector-strong -Wformat -Werror=format-security -fno-omit-frame-pointer' 'LDFLAGS=-Wl,-Bsymbolic-functions -flto=auto -ffat-lto-objects -flto=auto -Wl,-z,relro -Wl,-z,now' '--enable-tap-tests' '--with-icu' '--with-llvm' 'LLVM_CONFIG=/usr/bin/llvm-config-14' 'CLANG=/usr/bin/clang-14' '--with-systemd' '--with-selinux' 'build_alias=x86_64-linux-gnu' 'CPPFLAGS=-Wdate-time -D_FORTIFY_SOURCE=2' 'CXXFLAGS=-g -O2 -flto=auto -ffat-lto-objects -flto=auto -ffat-lto-objects -fstack-protector-strong -Wformat -Werror=format-security'

CC = gcc

CPPFLAGS = -Wdate-time -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -I/usr/include/libxml2

CFLAGS = -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -g -g -O2 -flto=auto -ffat-lto-objects -flto=auto -ffat-lto-objects -fstack-protector-strong -Wformat -Werror=format-security -fno-omit-frame-pointer

CFLAGS_SL = -fPIC

LDFLAGS = -Wl,-Bsymbolic-functions -flto=auto -ffat-lto-objects -flto=auto -Wl,-z,relro -Wl,-z,now -L/usr/lib/llvm-14/lib -Wl,--as-needed

LDFLAGS_EX = 

LDFLAGS_SL = 

LIBS = -lpgcommon -lpgport -lselinux -lxslt -lxml2 -lpam -lssl -lcrypto -lgssapi_krb5 -lz -ledit -lcrypt -lm 

VERSION = PostgreSQL 12.14 (Ubuntu 12.14-1.pgdg22.04+1)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: if you get an error that &lt;code&gt;command not found&lt;/code&gt; then you should add your postgres installation directory to PATH. If you followed my previous article the default location is &lt;code&gt;/usr/lib/postgresql/12/&lt;/code&gt;. You can add to path by using the following command &lt;code&gt;export PATH="/usr/lib/postgresql/12/bin:$PATH"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Add the PG_CONFIG environment variable and install&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export PG_CONFIG="/usr/lib/postgresql/12/bin/pg_config"
sudo make install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also combine the two above into one command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo make PG_CONFIG="/usr/lib/postgresql/12/bin/pg_config" install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;This might take a while&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After installation connect to a database on your postgres server. We created a db &lt;code&gt;test&lt;/code&gt; in last article. we can connect to it&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ceejay@ceejay:~/age$ psql test

psql (12.14 (Ubuntu 12.14-1.pgdg22.04+1))

Type "help" for help.



test=# 

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can then create and load the extension into our database&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;test=# CREATE EXTENSION age;

CREATE EXTENSION

test=# LOAD 'age';

LOAD

test=# 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We then add the ag_catalog to search_path, to simplify our queries&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;test=# SET search_path = ag_catalog, "$user", public;

SET

test=# 

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can check the list of extensions installed with the following&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;test=# \dx

                 List of installed extensions

  Name   | Version |   Schema   |         Description          

---------+---------+------------+------------------------------

 age     | 1.1.1   | ag_catalog | AGE database extension

 plpgsql | 1.0     | pg_catalog | PL/pgSQL procedural language

(2 rows)



test=# 

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Now we've been able to successfully install the apache age extension on our postgres database. In the next parts of the series, we'll be playing with the graph extension itself and see the cool and powerful stuffs we can do with it. if you run into errors or issues while installing let me know in the comment section. See you in the next episode!.&lt;/p&gt;

</description>
      <category>age</category>
      <category>apacheage</category>
    </item>
    <item>
      <title>APACHE AGE: Getting Started Part 1(PosgreSQL Installation)</title>
      <dc:creator>ERINFOLAMI PETER</dc:creator>
      <pubDate>Fri, 14 Apr 2023 09:06:01 +0000</pubDate>
      <link>https://dev.to/dshady-programmer/apache-age-getting-started-part-1posgresql-installation-4o5o</link>
      <guid>https://dev.to/dshady-programmer/apache-age-getting-started-part-1posgresql-installation-4o5o</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In this article i'll be walking you through the installation of the Apache AGE PostgreSQL extension and then in my upcoming articles we'll try out some cool stuffs with the extension together. But before we go into the installation process I'd assume you know what a database is? and also you know what SQL is? and finally you know about PostgreSQL. If you don't, you can get started with some of these:&lt;br&gt;
&lt;a href="https://www.w3schools.com/sql/" rel="noopener noreferrer"&gt;Quick introduction to SQL&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.postgresql.org/docs/" rel="noopener noreferrer"&gt;Getting started with PostgreSQL&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  What then is Apache AGE?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F21yfte7e5h7ird2tcs59.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F21yfte7e5h7ird2tcs59.png" alt=" " width="512" height="288"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Apache AGE is an open-source graph database management system that provides a powerful and scalable solution for storing, managing and analyzing large-scale graph data. It is built as an extension of PostgreSQL and supports complex graph queries and provides fast query response times, making it an excellent choice over traditional relational database management systems. With Apache AGE, users can gain deeper insights into data and make more informed decisions. So we can simply say Apache AGE gives you the super power of expressing your database graphically.&lt;/p&gt;

&lt;p&gt;Cool? 😉&lt;/p&gt;

&lt;p&gt;Before we get to play around with it let's get started with installing it on our local machine.&lt;/p&gt;
&lt;h3&gt;
  
  
  Setting up
&lt;/h3&gt;

&lt;p&gt;Like i said earlier Apache AGE is a PostgreSQL extension so to use it we need to get PostgreSQL installed on your machine. Apache AGE is only compatible with 3 versions of PostgreSQL (11, 12, 13(only compatible with the newest release)). For this article series we'll be working with the version 11/12, we'll talk about the new Apache AGE release that's compatible with the PostgreSQL 13 later when we are comfortable with the previous versions. Before we start installing postgres we'll need to install some dependencies on our machine for Apache AGE to work on your local machine. It is important to know that Apache AGE would only work on a Linux Operating System distribution. If you use Windows OS consider installing a virtual machine or try out &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;wsl&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Run the following command to install the aforementioned dependencies&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ubuntu&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt-get install build-essential libreadline-dev zlib1g-dev flex bison
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Fedora&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dnf install gcc glibc bison flex readline readline-devel zlib zlib-devel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Centos&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yum install gcc glibc glib-common readline readline-devel zlib zlib-devel flex bison
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now to installing PostgreSQL.&lt;br&gt;
For demonstration I'll be working with PostgreSQL 12, there are more than one ways to install postgres on your computer, one way is by compiling directly from the source code, you can go through this &lt;a href="https://www.postgresql.org/docs/15/install-getsource.html" rel="noopener noreferrer"&gt;guide&lt;/a&gt; to try that.&lt;br&gt;
But I'll be installing via the ubuntu postgresql apt repository&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: &lt;br&gt;
This only works on an ubuntu machine (Linux) to get it working on other operating systems or distributions you might want to check out the official documentation for your OS and distributions &lt;a href="https://www.postgresql.org/download/" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;for ubuntu &amp;gt;= 18.04:&lt;br&gt;
Run the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" &amp;gt; /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update
sudo apt-get -y install postgresql-12
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After installation (if you get any errors let me know in the comments), you need to add the bin directory path to the &lt;code&gt;PATH&lt;/code&gt; env variable if not already added. By default the installation path is &lt;code&gt;/usr/lib/postgresql/&amp;lt;version&amp;gt;&lt;/code&gt; for version 12 it'll be &lt;code&gt;/usr/lib/postgresql/12/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;To add to &lt;code&gt;PATH&lt;/code&gt; you can run &lt;code&gt;export PATH="/usr/lib/postgresql/12/bin/:$PATH"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You might want to consider adding that to your &lt;code&gt;.bash_profile&lt;/code&gt; or &lt;code&gt;.bash_rc&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Also make sure you confirm that postgres service is running &lt;code&gt;sudo systemctl status postgresql&lt;/code&gt; if it's inactive or not running, you can run &lt;code&gt;sudo systemctl start postgresql&lt;/code&gt; to start it up.&lt;/p&gt;

&lt;p&gt;To login to your postgres database for the first time, you need to use the default admin user created by postgres. So to go into postgres you need to run &lt;code&gt;sudo -u postgres psql&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ceejay@ceejay:~$ sudo -u postgres psql

psql (12.14 (Ubuntu 12.14-1.pgdg22.04+1))

Type "help" for help.



postgres=# \conninfo

You are connected to database "postgres" as user "postgres" via socket in "/var/run/postgresql" at port "5432".

postgres=# 

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's go ahead and create a database &lt;br&gt;
&lt;code&gt;sudo -u postgres createdb &amp;lt;dbname&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;We can also create a user&lt;br&gt;
&lt;code&gt;sudo -u postgres createuser &amp;lt;username&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Create a password for the user&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ceejay@ceejay:~$ sudo -u postgres psql

psql (12.14 (Ubuntu 12.14-1.pgdg22.04+1))

Type "help" for help.

postgres-# \password ceejay

Enter new password for user "ceejay": 

Enter it again: 

postgres-# 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For me the user created earlier is &lt;code&gt;ceejay&lt;/code&gt; so for you change it to your the user you created earlier.&lt;/p&gt;

&lt;p&gt;Let's check if our database was actually created.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;postgres-# \l

                             List of databases

   Name    |  Owner   | Encoding | Collate | Ctype |   Access privileges   

-----------+----------+----------+---------+-------+-----------------------

 postgres  | postgres | UTF8     | en_NG   | en_NG | 

 template0 | postgres | UTF8     | en_NG   | en_NG | =c/postgres          +

           |          |          |         |       | postgres=CTc/postgres

 template1 | postgres | UTF8     | en_NG   | en_NG | =c/postgres          +

           |          |          |         |       | postgres=CTc/postgres

 test      | postgres | UTF8     | en_NG   | en_NG | 

(4 rows)



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;You can do a lot more with postgresql, consider reading the documentation to learn more, for example you can try creating another database with the newly created user, noticed from above we used the default admin &lt;code&gt;postgres&lt;/code&gt; to do that with the &lt;code&gt;sudo -u postgres createdb &amp;lt;db_name&amp;gt;&lt;/code&gt; line, i was able to create it because the admin has all the privileges to do so, so you can consider granting the new user the privileges to create a new database. In the next article of this series we'll go ahead and install the Apache AGE extension on top of our postgres. If you encountered any errors or have any questions leave them in the comment section below. &lt;br&gt;
Next we'll be installing the AGE extension. &lt;/p&gt;

</description>
      <category>age</category>
      <category>apacheage</category>
    </item>
  </channel>
</rss>
