Sign In
Sign In

How to Create and Deploy a Gin App on Hostman App Platform

How to Create and Deploy a Gin App on Hostman App Platform
Hostman Team
Technical writer
Go
16.01.2025
Reading time: 14 min

Gin is a highly efficient HTTP web framework written in the Go programming language, providing developers with powerful tools for building web applications, RESTful APIs, and microservices. It stands out among other frameworks due to its high request processing speed, flexible configuration, and ease of use.

One of Gin’s key advantages is its performance. Gin uses a minimalist approach to handling HTTP requests, making it one of the fastest frameworks on the market. It is built on the net/http module from Golang’s standard library, ensuring excellent integration with Go’s ecosystem and enabling the use of Go’s concurrency features to handle a large number of simultaneous requests.

Another important advantage of Gin is its simplicity. The syntax and structure of Gin are intuitive, reducing the learning curve for developers and speeding up the development process. Its built-in routing system makes it easy to define and handle routes, while its powerful middleware system allows flexible request handling.

Gin’s flexibility is also worth mentioning. It allows you to extend functionality  through plugins and middleware, enabling adaptation to specific project requirements. Built-in support for JSON and other data formats simplifies the creation of RESTful APIs, and tools for handling requests and responses make data management straightforward.

In addition, Gin has an active community and solid documentation, making it an excellent choice for developers looking for a reliable and well-supported framework. There are plenty of resources, including code examples, guides, and libraries, that make the learning and development process easier.

Creating the Application

Functionality Overview

Our application will support basic CRUD operations (Create, Read, Update, Delete) for notes through a RESTful API. During development, we will discuss key aspects of integrating Gin with the GORM ORM library and demonstrate how to ensure the security and performance of our web application. The main features of our application include:

  1. Creating a New Note

    • The user can add a new note by sending a POST request with the note’s title and content.
    • The application will save the new note in the database and return its unique identifier.
  1. Retrieving All Notes

    • The user can request a list of all notes by sending a GET request.
    • The application will return all notes from the database in JSON format.
  1. Retrieving a Note by ID

    • The user can retrieve a specific note by its ID by sending a GET request with the specified ID.
    • The application will find the note in the database and return it in JSON format.
  1. Updating an Existing Note

    • The user can update an existing note by sending a PUT request with a new title and content.
    • The application will update the note’s data in the database and return the updated note.
  1. Deleting a Note

    • The user can delete a note by its ID by sending a DELETE request with the specified ID.
    • The application will remove the note from the database and return a status indicating the successful completion of the operation.

Project Setup

It is assumed that you have Go version 1.22 installed (you can install it using one of these guides: Windows, Ubuntu, MacOS). If you use an earlier version, errors may occur during the project setup and launch process. Additionally, you should have a basic understanding of Git and an account on one of the Git repository hosting services (GitHub, GitLab, Bitbucket, Gitea, etc.).

Step 1: Create a Project Directory

Run the following command to create the project directory:

mkdir GinApp

Navigate into the newly created directory:

cd GinApp

Step 2: Initialize a New Go Module

Run the following command to initialize a new Golang module:

go mod init gin-notes-api

Step 3: Install Required Packages

We will install the necessary packages for the project: Gin, GORM, and SQLite (for database interaction) using the following commands:

go get -u github.com/gin-gonic/gin
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite

Step 4: Create the Project Structure

The project structure should look like this:

GinApp/  
ā”œā”€ā”€ go.mod  
ā”œā”€ā”€ main.go  
ā”œā”€ā”€ models/  
│   └── note.go  
ā”œā”€ā”€ handlers/  
│   └── note_handlers.go  
ā”œā”€ā”€ storage/  
│   ā”œā”€ā”€ storage.go  
│   └── database.go  

You can create this structure using your IDE’s file explorer or by running the following command in the terminal:

mkdir -p models handlers storage && touch go.mod main.go models/note.go handlers/note_handlers.go storage/storage.go storage/database.go

Application Structure

models/note.go

Defines the data structure for notes. The Note model describes the fields of a note and is used to interact with the database through the GORM ORM library.

package models  

// Definition of the Note structure  
type Note struct {  
	ID      int    `json:"id" gorm:"primaryKey;autoIncrement"` // Unique identifier, auto-incremented  
	Title   string `json:"title"`                               // Note title  
	Content string `json:"content"`                             // Note content  
}  

storage/database.go

This file contains functions for initializing the database and retrieving the database instance. GORM is used to work with the SQLite database.

package storage  

import (  
	"gorm.io/driver/sqlite"  // Driver for SQLite  
	"gorm.io/gorm"           // GORM ORM library  
	"gin-notes-api/models"   // Importing the package with data models  
)  

// Declare a global variable to store the database instance  
var db *gorm.DB  

// Function to initialize the database  
func InitDatabase() error {  
	var err error  
	db, err = gorm.Open(sqlite.Open("notes.db"), &gorm.Config{}) // Connect to SQLite using GORM  
	if err != nil {  
		return err // Return an error if the connection fails  
	}  
	return db.AutoMigrate(&models.Note{}) // Automatically create the Note table if it doesn’t exist  
}  

// Function to retrieve the database instance  
func GetDB() *gorm.DB {  
	return db // Return the global db variable containing the database connection  
}  

storage/storage.go

This file provides CRUD (Create, Read, Update, Delete) operations for the Note model using GORM to interact with the SQLite database.

package storage  

import (  
	"gin-notes-api/models" // Importing the package with data models  
)  

// Function to retrieve all notes from the database  
func GetAllNotes() []models.Note {  
	var notes []models.Note  
	db.Find(¬es) // Use GORM to execute a SELECT query and fill the notes slice  
	return notes    // Return all retrieved notes  
}  

// Function to retrieve a note by ID  
func GetNoteByID(id int) *models.Note {  
	var note models.Note  
	if result := db.First(¬e, id); result.Error != nil {  
		return nil // Return nil if the note with the specified ID is not found  
	}  
	return ¬e // Return the found note  
}  

// Function to create a new note  
func CreateNote(title, content string) models.Note {  
	note := models.Note{  
		Title:   title,  
		Content: content,  
	}  
	db.Create(¬e) // Use GORM to execute an INSERT query and save the new note  
	return note      // Return the created note  
}  

// Function to update an existing note by ID  
func UpdateNote(id int, title, content string) *models.Note {  
	var note models.Note  
	if result := db.First(¬e, id); result.Error != nil {  
		return nil // Return nil if the note with the specified ID is not found  
	}  
	note.Title = title  
	note.Content = content  
	db.Save(¬e) // Use GORM to execute an UPDATE query and save the updated note  
	return ¬e   // Return the updated note  
}  

// Function to delete a note by ID  
func DeleteNoteByID(id int) bool {  
	if result := db.Delete(&models.Note{}, id); result.Error != nil {  
		return false // Return false if deletion fails  
	}  
	return true // Return true if the note is successfully deleted  
} 

handlers/note_handlers.go

This file contains handler functions for processing HTTP requests. These functions are triggered in response to different routes and perform actions such as creating, retrieving, updating, and deleting notes.

package handlers  

import (  
	"net/http"                 // HTTP package  
	"strconv"                  // For converting strings to other data types  

	"github.com/gin-gonic/gin" // Gin web framework  
	"gin-notes-api/storage"    // Import the storage module for database operations  
)  

// Handler for retrieving all notes  
func GetNotes(c *gin.Context) {  
	notes := storage.GetAllNotes()               // Fetch all notes from storage  
	c.JSON(http.StatusOK, notes)                 // Return notes in JSON format with a 200 OK status  
}  

// Handler for retrieving a note by ID  
func GetNoteByID(c *gin.Context) {  
	id, err := strconv.Atoi(c.Param("id"))       // Convert the ID parameter from string to integer  
	if err != nil {  
		c.JSON(http.StatusBadRequest, gin.H{     // Return 400 Bad Request if the ID is invalid  
			"error": "Invalid note ID",  
		})  
		return  
	}  
	note := storage.GetNoteByID(id)              // Fetch the note by ID from storage  
	if note == nil {  
		c.JSON(http.StatusNotFound, gin.H{       // Return 404 Not Found if the note is not found  
			"error": "Note not found",  
		})  
		return  
	}  
	c.JSON(http.StatusOK, note)                  // Return the found note in JSON format with a 200 OK status  
}  

// Handler for creating a new note  
func CreateNote(c *gin.Context) {  
	var input struct {  
		Title   string `json:"title" binding:"required"`  
		Content string `json:"content" binding:"required"`  
	}  
	if err := c.ShouldBindJSON(&input); err != nil {  
		c.JSON(http.StatusBadRequest, gin.H{     // Return 400 Bad Request if the input data is invalid  
			"error": err.Error(),  
		})  
		return  
	}  
	note := storage.CreateNote(input.Title, input.Content) // Create a new note in storage  
	c.JSON(http.StatusCreated, note)                       // Return the created note in JSON format with a 201 Created status  
}  

// Handler for updating an existing note by ID  
func UpdateNoteByID(c *gin.Context) {  
	id, err := strconv.Atoi(c.Param("id"))       // Convert the ID parameter from string to integer  
	if err != nil {  
		c.JSON(http.StatusBadRequest, gin.H{     // Return 400 Bad Request if the ID is invalid  
			"error": "Invalid note ID",  
		})  
		return  
	}  
	var input struct {  
		Title   string `json:"title" binding:"required"`  
		Content string `json:"content" binding:"required"`  
	}  
	if err := c.ShouldBindJSON(&input); err != nil {  
		c.JSON(http.StatusBadRequest, gin.H{     // Return 400 Bad Request if the input data is invalid  
			"error": err.Error(),  
		})  
		return  
	}  
	note := storage.UpdateNote(id, input.Title, input.Content) // Update the note in storage  
	if note == nil {  
		c.JSON(http.StatusNotFound, gin.H{       // Return 404 Not Found if the note is not found  
			"error": "Note not found",  
		})  
		return  
	}  
	c.JSON(http.StatusOK, note)                  // Return the updated note in JSON format with a 200 OK status  
}  

// Handler for deleting a note by ID  
func DeleteNoteByID(c *gin.Context) {  
	id, err := strconv.Atoi(c.Param("id"))       // Convert the ID parameter from string to integer  
	if err != nil {  
		c.JSON(http.StatusBadRequest, gin.H{     // Return 400 Bad Request if the ID is invalid  
			"error": "Invalid note ID",  
		})  
		return  
	}  
	if success := storage.DeleteNoteByID(id); !success {  
		c.JSON(http.StatusNotFound, gin.H{       // Return 404 Not Found if the note is not found  
			"error": "Note not found",  
		})  
		return  
	}  
	c.Status(http.StatusNoContent)              // Return 204 No Content on successful deletion  
}  

main.go

This file serves as the main entry point of the application. It initializes the database and sets up routes for handling HTTP requests using the Gin web framework.

package main

import (
	"log"                      // Package for logging
	"github.com/gin-gonic/gin" // Gin web framework
	"gin-notes-api/handlers"   // Importing the module with request handlers
	"gin-notes-api/storage"    // Importing the module for database operations
)

func main() {
	// Initialize the database
	if err := storage.InitDatabase(); err != nil {
		log.Fatalf("Failed to initialize database: %v", err) // Log the error and terminate the program if database initialization fails
	}

	// Create a new Gin router with default settings
	router := gin.Default()

	// Define routes and bind them to their respective handlers
	router.GET("/notes", handlers.GetNotes)             // Route for retrieving all notes
	router.GET("/notes/:id", handlers.GetNoteByID)      // Route for retrieving a note by ID
	router.POST("/notes", handlers.CreateNote)          // Route for creating a new note
	router.PUT("/notes/:id", handlers.UpdateNoteByID)   // Route for updating a note by ID
	router.DELETE("/notes/:id", handlers.DeleteNoteByID) // Route for deleting a note by ID

	// Start the web server on port 8080
	router.Run(":8080")
}

Now we can run the application locally and test its functionality.

To start the application, use the following command:

go run main.go

Examples of curl Requests for Testing Functionality

Create a New Note

This request creates a new note with a specified title and content.

curl -X POST http://localhost:8080/notes \
-H "Content-Type: application/json" \
-d '{"title":"Title","content":"Note body"}'

Get All Notes

This request retrieves a list of all notes stored in the database.

curl -X GET http://localhost:8080/notes

Get a Note by ID

This request fetches a specific note by its unique ID.

curl -X GET http://localhost:8080/notes/1

Update a Note by ID

This request updates an existing note by its ID, providing a new title and content.

curl -X PUT http://localhost:8080/notes/1 \
-H "Content-Type: application/json" \
-d '{"title":"Updated Title","content":"Updated note body"}'

Delete a Note by ID

This request deletes a note with a specific ID.

curl -X DELETE http://localhost:8080/notes/1

Deploying the Gin Application on Hostman App Platform

Creating and Uploading the Repository

To deploy the application using Hostman App Platform, first ensure your project is hosted in a Git repository. This example uses GitHub.

  1. Initialize a Git repository locally in your project directory:

git init -b main
git add .
git commit -m 'First commit'
  1. Push the repository to a remote server using the commands provided when creating a new GitHub repository:

git remote add origin git@github.com:your_user/your_repository.git
git push -u origin main

Setting Up Hostman App Platform

  1. Go to the App Platform section in Hostman and click Create app.

  2. Under the Type section, choose the Backend tab and select the Gin framework.

  3. Connect your GitHub account by granting access to the repositories, or manually select the necessary repository.

  4. After connecting your GitHub account, select the repository containing your application in the Repository section.

  5. Choose a region where your application will be hosted.

  6. In the Configuration section, select the minimum settings; they are sufficient for this project. You can modify them later if needed.

  7. Leave the default values in the App settings section. For more complex projects, you may specify environment variables and custom build commands.

  8. Specify a name for your application and click Start deploy.

Deployment Process

  • The deployment process can take up to 10 minutes. Once it’s completed, you will see the message “Deployment successfully completed” in the deployment logs.

  • Navigate to the Settings tab on the application page to view the domain assigned to your app.
    In the same section, you can modify the server configuration, edit deployment settings, and update the domain binding. If you connect a custom domain, a Let’s Encrypt SSL certificate will be automatically issued and renewed 7 days before expiration.

Testing the Application

To verify that the application is working correctly, execute a curl request, replacing localhost with the assigned domain:

curl -X GET https://your_domain/notes

Conclusion

In this tutorial, we have developed a basic web application for managing notes using the Gin framework and GORM library. The created RESTful API supports basic CRUD operations, making the application simple and user-friendly.

Gin proved to be an efficient and easy-to-learn tool. Its routing system and support for concurrent requests made development smoother. GORM facilitated database interaction by automating many tasks.

The application was successfully deployed on the Hostman App Platform, providing a fast and reliable deployment process. 

In the future, we can enhance the application by adding new features such as user authentication and advanced note search capabilities.

This project demonstrated how modern development tools like Gin and GORM simplify web application creation.

Go
16.01.2025
Reading time: 14 min

Similar

Go

How to Install Go on Windows

Go, or Golang, is a high-performance, multithreaded programming language developed by Google in 2007 and released in 2009. To this day, Golang continues to gain popularity.  The Go programming language is a flexible option for development on a variety of platforms because it supports a wide range of operating systems. We will go over how to install Golang on Windows step-by-step in this tutorial. Installing GO on Windows is a simple process Installing Go on Windows Go supports Windows 7 and newer versions. Ensure that you have a supported version of the OS installed. In this guide, we will use Windows 11. You will also need an administrator account to configure environment variables. To install Golang on Windows: Download the installer for the latest version of Microsoft Windows from the official Go website. If needed, you can select any other available version of the language instead of the latest one. Once the file has finished downloading, run it and follow the installation wizard's instructions. If necessary, you can change the file location. This will be useful when configuring environment variables. After the installation, check if Golang was successfully installed on your system. To do this, open the terminal (Win + R → cmd) and run the following command: go version The output should show the version of Go you just installed. For example: GO version check To update Golang to a newer version on Windows, you must uninstall the old version and follow the instructions to install the new one. Now, let's move on to setting up environment variables so that Go works properly. Setting Up Environment Variables In order for the operating system to identify the location of the required Go files and directories, setting up environment variables is a crucial step in the Go installation process on Windows. For Go to work correctly, two environment variables are required: GOPATH points to where Go stores downloaded and compiled packages. PATH allows the system to find Go executable files without specifying their full paths. GOPATH First, let's set up the GOPATH environment variable. For this, you need to organize a workspace where Go files and projects will be stored. In this guide, we will create a workspace at C:\GoProject. We will also add two directories to this folder: bin – for storing executable files (binary files). Go creates an executable file and places it in this directory when you compile your project. src – for storing Go source files. All .go files will be placed here. After creating the workspace, we will set the GOPATH environment variable. To do this, go to the Control Panel → System and Security → System and click on Advanced System Settings. There is also an easier way to access system properties: open the Run window (Win + R) and enter: sysdm.cpl Click on Environment Variables, then click the New button under the User Variables section. Here, you need to fill in two fields: the variable name and its value. In the Variable name field, enter GOPATH, and in the Variable value field, enter the path to the workspace you created earlier (in our case, C:\GoProject). Click OK twice to save the changes. To verify the creation of the system variable, open the Run window (Win + R) and enter the string: %GOPATH% If everything was done correctly, your workspace will open. PATH The PATH environment variable should have been automatically added after we installed Go. To check this, go to the Control Panel → System and Security → System and click on Advanced System Settings. In the window that opens, you need to find PATH among the system variables. To view its values, double-click on it. In the new window, there should be an entry that holds the path to the Go bin folder. Go installation path In our case, it is C:\Program Files\Go\bin. If your value does not match what was specified during the Go installation, change it to the correct one using the Edit button. Golang has now been installed on Windows, and environment variables have been set up. We can now write and execute our first program to test its functionality. Verifying Installation To check the functionality of the newly installed Golang on Windows: Š”reate a test file with the .go extension in the workspace (C:\GoProject\src). For example, ExampleProgram.go. Add the following simple code: package mainimport "fmt"func main() {    fmt.Println("Hello, Go has been successfully installed into your system!")} The program should display a message confirming that Go has been successfully installed on your system. To compile and run the program, enter the following command in the terminal: go run %GOPATH%/src/ExampleProgram.go As shown in the image below, the program compiles and runs, displaying the specified text on the screen. Go Successfully Installed Conclusion Installing Go on Windows is a straightforward process, involving downloading the installer, setting up environment variables, and verifying the installation. Once Go is properly configured, you can easily start developing applications. With support for multiple operating systems, Go remains a powerful and versatile language, ideal for cross-platform development. On our app platform you can deploy Golang apps, such as Beego and Gin. 
25 August 2025 Ā· 5 min to read
Go

How to Install Go on MacOS

MacOS is an operating system for desktop computers and tablets developed by Apple specifically for its devices. It is initially pre-installed on all Apple devices, specifically the Apple Macintosh or Mac for short. Unlike Linux, macOS is a proprietary operating system, which, of course, brings certain peculiarities in installing various development tools on it. To see more details about it, check our instruction on how to deploy cloud server on MacOS. In this article, we will take a detailed look at how to install Go on a macOS computer. Google created the open source programming language Golang, or just Go, to build microservice-based systems. You may find other Go frameworks, like Beego and Gin, on our app platform. To ensure the stability of your computer and the Go compiler, we recommend using the latest version of macOS. Installing GO is a Simple Process 1. Uninstall old Golang versions Check if Golang is already installed Before you start installing Golang, first check if it is installed on your system already. A simple way to do this is to run a command that outputs the Golang version: go version If Go is indeed installed, you will see a message in the console terminal displaying the language version and the operating system's name. Something like this: go version go1.21.3 darwin/amd64 Uninstall Golang If Go is present on your system, you need to uninstall it to avoid possible installation conflicts. MacOS stores files from the Golang package in a predetermined location: The /usr/local/go directory. This is where Golang itself is placed. The /etc/paths.d/go file. Golang environment variables are specified here. So, to uninstall Golang, you need to clear the above directories: rm -rf /usr/local/go rm -rf /etc/paths.d/go The rm command deletes a directory or a file, while the -rf flag indicates a recursive-forced type of deletion. r stands for recursive and is used to delete the specified folder, all its subfolders, subfolders of subfolders, etc. f stands for force so no external states or variables can prevent the deletion from occurring Great! Golang is now removed from your computer. This means we can move on to downloading the Golang package for macOS and then installing it. 2. Download Golang The Go language archive can be downloaded to your computer in two different ways. One is highly automated, while the other more manual. Let's examine both. Manual download The official Golang website has a special page with links to download the latest version of Go. Once you open it, you will see several buttons leading to the latest language version for a particular platform. We are interested in the Apple operating system. At the moment of writing this article, there are two versions of the language for MacOS. One is for the new Apple ARM64 processor architecture, and the other is for the classic Intel 65-bit architecture. You should choose the one that suits your device. The latest Mac models have ARM64 processors. Clicking on the link will start downloading the archive file named go1.21.3.darwin-amd64.pkg, or a later version. Download via console An alternative to downloading manually is using the command line. MacOS has a special curl tool included in the operating system. So we can use the curl utility with the exact URL where the Golang archive file is available: curl -o golang.pkg https://dl.google.com/go/go1.21.3.darwin-amd64.pkg This command uses a special flag -o (--output), which ensures that the data received through the curl request is written to the golang.pkg file. Note that the URL contains the exact name of the file we want to download and the Golang version. When the curl command is finished, we will have a golang.pkg file containing the Golang language package. Then we just need to install it. 3. Install the Go package As with the download, installation is also available in two ways: through the GUI or the command line interface. Installing via GUI To install Go on macOs, simply run the downloaded package.  After the automatic installation is done, you will get a success message confirming that the software is installed. Installing via command line If you prefer working with the terminal, run the following command: sudo open golang.pkg After that, follow to the terminal's instructions until a popup confirming the installation's success displays. 4. Set environment variables After installation, we must tell the system where to find the Golang compiler when the console terminal receives the command to compile and run the application. First, let's navigate to the home directory using the following command: cd ~ Now add the locations of the Golang components to .bash_profile. This file is automatically loaded when you log in to your macOS account and contains all the startup configurations for the command line interface. Add environment variables to the end of the file, either manually or via the echo command: echo "export GOROOT=/usr/local/go" >> .bash_profileecho "export GOPATH=$HOME/Documents/go" >> .bash_profileecho "export PATH=$GOPATH/bin:$GOROOT/bin:$PATH" >> .bash_profile The >> operator indicates that the text in quotes after echo will be written to the .bash_profile file. The GOROOT variable points to the directory where the Go compiler is installed. GOPATH contains the address of the Go working directory. And PATH helps the command line to find binary files during source compilation. 5. Check the installation To verify that Golang has been successfully installed on macOS, you need to restart the command line terminal and query the Go version: go version If the installation was done correctly, the console will display a message: go version go1.21.3 darwin/amd64 6. Launch a test application In this article we won't go into the details of Golang syntax and peculiarities of programming in this language. We will just write, compile, and run a simple program with trivial output to the console to make sure that the installed compiler works. Let's create a new file in our home directory using the nano editor: nano main.go Then fill it with the following contents: package main import "fmt" func main() { fmt.Println("Hello, World!") // CONCLUSION: Hello, World! } To exit nano, press "CTRL+X". When prompted to save the file, press "Y", then "ENTER". Now we can compile and run our program with just one command: go run main.go There is also another command that builds the application source code into a complete executable file that can be distributed and deployed to other local machines: go build If you don't specify the name of the go file as an argument, the command will compile the file with the standard name main.go. For example, if the file containing our program were named test.go, the build command would look like this: go build test.go During build, the Go compiler will include all the .go files involved in the final "build", adding the auxiliary code needed to run the application on any computer with the same system architecture. Building to an executable file allows programs to run on other computers regardless of whether the Golang compiler itself is directly installed on them. Visualization of Go Installation on MacOS Conclusion Despite being a proprietary operating system, macOS allows you to install tools from third-party companies and developers (in our case, Google), including open-source solutions. In this article, we have looked at the standard way of installing the Golang compiler on macOS, which includes a few basic steps: Checking for older versions Uninstalling the old versions if they exist Downloading the package from the official website (manually or automatically) Installing the downloaded package (via GUI or terminal) Adding environment variables Checking if the installation is correct Compiling and running a simple code With these steps, we installed Go on macOS and ran our first program using fairly simple commands. For further study of the language and deeper familiarization with its syntax, we recommend checking the documentation on the official Golang website. Also, Hostman offers various VPS Servers for you to host on Mac by low price! Frequently Asked Questions How to install Go on Mac without Homebrew? Download the installer from golang.org, run it, and then update your PATH manually. What is the easiest way to install Go on macOS? Honestly? Just run brew install go if you already use Homebrew — it’s fast and simple. How do I set the PATH for Go on macOS? Add this line to your shell config: export PATH=$PATH:/usr/local/go/bin. Where is Go installed on macOS? Usually at /usr/local/go when using the official package.
21 August 2025 Ā· 7 min to read
Microservices

Database Connection in Python, Go, and JavaScript

Databases are an essential part of almost any project today. Database interactions are especially familiar to system and database administrators, DevOps/SRE professionals, and software developers. While administrators typically deploy one or multiple database instances and configure the necessary connection parameters for applications, developers need to connect directly to the database within their code. This article explores how to connect to databases using different programming languages. Prerequisites We will provide examples for connecting to MySQL, PostgreSQL, Redis, MongoDB, and ClickHouse databases using Python, Go, and JavaScript. To follow this guide, you will need: A database deployed on a server or in the cloud. Installed environments for Python, Go, and JavaScript, depending on your application programming language. Additionally for Python: pip installed. Additionally for JavaScript: Node.js and npm installed. Database Connection in Python MySQL and Python For connecting to MySQL databases, we can use a Python driver called MySQL Connector. Install the driver using pip: pip install mysql-connector-python Initialize a new connection: Import the mysql.connector library and the Error class to handle specific connection errors. Create a function named create_connection, passing the database address (host), user name (user), and user password (password). To establish the connection, define a class called create_connection that receives the variable names containing the database connection details. import mysql.connector from mysql.connector import Error def create_connection(host_name, user_name, user_password): connection = None try: connection = mysql.connector.connect( host="91.206.179.29", user="gen_user", password="m-EE6Wm}z@wCKe" ) print("Successfully connected to MySQL Server!") except Error as e: print(f"The error '{e}' occurred") return connection def execute_query(connection, query): cursor = connection.cursor() try: cursor.execute(query) connection.commit() print("Query executed successfully") except Error as e: print(f"The error '{e}' occurred") connection = create_connection("91.206.179.29", "gen_user", "m-EE6Wm}z@wCKe") Run the script. If everything works correctly, you will see the "Successfully connected to MySQL Server!" message. If any errors occur, the console will display error code and description. Create a new table: Connect to the database using the connection.database class, specifying the name of the database. Note that the database should already exist. To create a table, initialize a variable create_table_query containing the SQL CREATE TABLE query. For data insertion, initialize another variable insert_data_query with the SQL INSERT INTO query. To execute each query, use the execute_query class, which takes the database connection string and the variable containing the SQL query. connection.database = 'test_db' create_table_query = """ CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, age INT NOT NULL ) """ execute_query(connection, create_table_query) insert_data_query = """ INSERT INTO users (name, age) VALUES ('Alice', 30), ('Bob', 25) """ execute_query(connection, insert_data_query) if connection.is_connected(): connection.close() print("Connection closed") Run the script. PostgreSQL and Python Python offers several plugins for connecting to PostgreSQL, but the most popular one is psycopg2, which we will use here. Psycopg2 is one of the most frequently used Python plugins for PostgreSQL connections. One of its key advantages is its support for multithreading which allows you to maintain the database connection across multiple threads. Install psycopg2 using pip (if not already installed): pip install psycopg2-binary Connect to PostgreSQL. Import the Python psycopg2 package and create a function create_new_conn, using the try block. Establish the connection with the psycopg2.connect function, which requires the database name, user name, password, and database address as input. To initialize the connection, use the create_new_conn() function. Here’s the full code example for connecting to a database: import psycopg2 from psycopg2 import OperationalError def create_new_conn(): conn_to_postgres = None while not conn_to_postgres: try: conn_to_postgres = psycopg2.connect( default_db="default_db", default_user="gen_user", password_for_default_user="PasswordForDefautUser9893#", db_address="91.206.179.128" ) print("The connection to PostgreSQL has been successfully established!") except OperationalError as e: print(e) return conn_to_postgres conn_to_postgres = create_new_conn() Run the script: python3 connect_to_postgres.py If successful, you will see the "The connection to PostgreSQL has been successfully established!" message. . Next, create a table named books, which will have three columns. Use the cursor class for SQL expressions, such as creating database objects. If the query involves adding or modifying data, you must call the conn_to_postgres.commit() function afterward to apply the changes. import psycopg2 from psycopg2 import OperationalError def create_new_conn(): conn_to_postgres = None while not conn_to_postgres: try: conn_to_postgres = psycopg2.connect( default_db="default_db", default_user="gen_user", password_for_default_user="PasswordForDefautUser9893#", db_address="91.206.179.128" ) except OperationalError as e: print(e) return conn_to_postgres conn_to_postgres = create_new_conn() cursor = conn_to_postgres.cursor() cursor.execute(""" CREATE TABLE books ( book_id INT PRIMARY KEY NOT NULL, book_name VARCHAR(255) NOT NULL, book_author VARCHAR(255) NOT NULL ) """) conn_to_postgres.commit() print("Table Created successfully") Run the script: python3 create_table.py Now, let’s run INSERT INTO to add a new line: cursor.execute(""" INSERT INTO books (book_id,book_name,book_author) VALUES (1, 'Long Walk to Freedom', 'Nelson_Mandela') """) The full code is below: import psycopg2 from psycopg2 import OperationalError def create_new_conn(): conn_to_postgres = None while not conn_to_postgres: try: conn_to_postgres = psycopg2.connect( default_db="default_db", default_user="gen_user", password_for_default_user="PasswordForDefautUser9893#", db_address="91.206.179.128" ) except OperationalError as e: print(e) return conn_to_postgres conn_to_postgres = create_new_conn() cursor = conn_to_postgres.cursor() cursor.execute(""" INSERT INTO books (book_id,book_name,book_author) VALUES (1, 'Long Walk to Freedom', 'Nelson_Mandela') """) conn_to_postgres.commit() conn_to_postgres.close() print("Data inserted successfully") Run the script: python3 insert-data.py Redis and Python Redis belongs to the class of NoSQL databases, where data is stored in memory rather than on hard drives. It uses a key-value format for data storage. Redis has a wide range of applications, from data storage and caching to serving as a message broker. We will use the redis-py (or simply redis) library for connecting to Redis. Install the Redis library using pip: pip install redis Connecting to a Redis instance: Use a try block structure for connection, specifying the function redis.StrictRedis where you provide the Redis address, port, and user password. import redis try: connect_to_redis_server = redis.StrictRedis( redis_db_host=91.206.179.128, redis_db_port=6379, redis_user_password='PasswordForRedis6379') print connect_to_redis_server connect_to_redis_server.ping() print 'Successfully connected to Redis Server!' except Exception as ex: print 'Error:', ex exit('Failed to connect to Redis server.') Run the script: python3 connect_to_redis.py If successful, you will see a message like "Successfully connected to Redis Server!". Unlike relational databases, Redis stores data in a key-value format. The key uniquely identifies the corresponding value. Use the set method to create a new record. The example below creates a record with the key City and the value Berlin: print('Create new record:', connect_to_redis_server.set("City", "Berlin")) Use the get method to retrieve the value associated with a key: print('Print record using record key:', connect_to_redis_server.get("City")) Use the delete method to remove a record by its key: print('Delete record with key:', connect_to_redis_server.delete("City")) The complete code fragment is below. import redis try: connect_to_redis_server = redis.StrictRedis( redis_db_host=91.206.179.128, redis_db_port=6379, redis_user_password='PasswordForRedis6379') print ('New record created:', connect_to_redis_server.set("City", "Berlin")) print ('Print created record using record key', connect_to_redis_server.get("City")) print ('Delete created record with key :', connect_to_redis_server.delete("City")) except Exception as ex: print ('Error:', ex) MongoDB and Python MongoDB is another widely used NoSQL database that belongs to the document-oriented category. Data is organized as JSON-like documents. To connect to a MongoDB database with Python, the recommended library is PyMongo, which provides a synchronous API. Install the PyMongo plugin: pip3 install pymongo Connect to MongoDB server using the following Python code. Import the pymongo module and use the MongoClient class to specify the database server address. To establish a connection to the MongoDB server, use a try block for error handling: import pymongo connect_to_mongo = pymongo.MongoClient("mongodb://91.206.179.29:27017/") first_db = connect_to_mongo["mongo-db1"] try: first_db.command("serverStatus") except Exception as e: print(e) else: print("Successfully connected to MongoDB Server!") connect_to_mongo.close() Run: python3 connect_mongodb.py If the connection is successfully established, the script will return the message: "Successfully connected to MongoDB Server!" Add data to MongoDB. To add data, you need to create a dictionary. Let's create a dictionary named record1, containing three keys: record1 = { "name": "Alex", "age": 25, "location": "London" } To insert the dictionary data, use the insert_one method in MongoDB. insertrecord = collection1.insert_one(record1) import pymongo connect_to_mongo = pymongo.MongoClient("mongodb://91.206.179.29:27017/") db1 = connect_to_mongo["newdb"] collection1 = db1["userdata"] record1 = { "name": "Alex", "age": 25, "location": "London" } insertrecord = collection1.insert_one(record1) print(insertrecord) Run the script: python3 connect_mongodb.py ClickHouse and Python ClickHouse is a columnar NoSQL database where data is stored in columns rather than rows. It is widely used for handling analytical queries. Install the ClickHouse driver for Python. There is a dedicated plugin for ClickHouse called clickhouse-driver. Install the driver using the pip package manager: pip install clickhouse-driver Connect to ClickHouse. To initialize a connection with ClickHouse, you need to import the Client class from the clickhouse_driver library. To execute SQL queries, use the client.execute function. You also need to specify the engine. For more details on supported engines in ClickHouse, you can refer to the official documentation. We'll use the default engine, MergeTree. Next, create a new table called users and insert two columns with data. To list the data to be added to the table, use the tuple data type. After executing the necessary queries, make sure to close the connection to the database using the client.disconnect() method. The final code will look like this: from clickhouse_driver import Client client = Client(host=91.206.179.128', user='root', password='P@$$w0rd123', port=9000) client.execute(''' CREATE TABLE IF NOT EXISTS Users ( id UInt32, name String, ) ENGINE = MergeTree() ORDER BY id ''') data = [ (1, 'Alice'), (2, 'Mary') ] client.execute('INSERT INTO Users (id, name) VALUES', data) result = client.execute('SELECT * FROM Users') for row in result: print(row) client.disconnect() Database Connection in Go Go is one of the youngest programming languages, developed in 2009 by Google.  It is widely used in developing microservice architectures and network utilities. For example, services like Docker and Kubernetes are written in Go. Go supports integrating all popular databases, including PostgreSQL, Redis, MongoDB, MySQL, ClickHouse, etc. MySQL and Go For working with the MySQL databases in Go, use the go-sql-driver/mysql driver. Create a new directory for storing project files and navigate into it: mkdir mysql-connect && cd mysql-connect Create a go.mod file to store the dependencies: go mod init golang-connect-mysql Download the MySQL driver using the go get command: go get -u github.com/go-sql-driver/mysql Create a new file named main.go. Specify the database connection details in the dsn variable: package main import ( "database/sql" "fmt" "log" _ "github.com/go-sql-driver/mysql" ) func main() { dsn := "root:password@tcp(localhost:3306)/testdb" db, err := sql.Open("mysql", dsn) if err != nil { log.Fatal(err) } defer db.Close() if err := db.Ping(); err != nil { log.Fatal(err) } fmt.Println("Successfully connected to the database!") query := "INSERT INTO users (name, age) VALUES (?, ?)" result, err := db.Exec(query, "Alex", 25) if err != nil { log.Fatal(err) } lastInsertID, err := result.LastInsertId() if err != nil { log.Fatal(err) } fmt.Printf("Inserted data with ID: %d\n", lastInsertID) } PostgreSQL and Go To connect to PostgreSQL, use the pq driver. Before installing the driver, let's prepare our environment. Create a new directory for storing the project files and navigate into it: mkdir postgres-connect && cd postgres-connect Since we will be working with dependencies, we need to create a go.mod file to store them: go mod init golang-connect-postgres Download the pq driver using the go get command: go get github.com/lib/pq Create a new file named main.go. In addition to importing the pq library, it is necessary to add the database/sql library as Go does not come with official database drivers by default. The database/sql library consists of general, independent interfaces for working with databases. It is also important to note the underscore (empty identifier) when importing the pq module: _ "github.com/lib/pq" The empty identifier is used to avoid the "unused import" error, as in this case, we only need the driver to be registered in database/sql. The fmt package is required to output data to the standard output stream, for example, to the console. To open a connection to the database, the sql.Open function is used, which takes the connection string (connStr) and the driver name (postgres). The connection string specifies the username, database name, password, and host address: package main import ( "database/sql" "fmt" "log" _ "github.com/lib/pq" ) func main() { connStr := "user=golang dbname=db_for_golang password=Golanguserfordb0206$ host=47.45.249.146 sslmode=disable" db, err := sql.Open("postgres", connStr) if err != nil { log.Fatal(err) } defer db.Close() err = db.Ping() if err != nil { log.Fatal(err) } fmt.Println("Successfully connected to PostgreSQL!") } Compile and run: go run main.go If everything works correctly, the terminal will display the message Successfully connected to PostgreSQL! Now, let's look at an example of how to insert data into a table.  First, we need to create a table in the database. When using Hostman cloud databases, you can copy the PostgreSQL connection string displayed in the "Connections" section of the Hostman web interface. Make sure that the postgresql-client utility is installed on your device beforehand. Enter the psql shell and connect to the previously created database: \c db_for_golang Create a table named Cities with three fields — city_id, city_name, and city_population: CREATE TABLE Cities ( city_id INT PRIMARY KEY, city_name VARCHAR(45) NOT NULL, city_population INT NOT NULL); Grant full privileges to the created table for the user: GRANT ALL PRIVILEGES ON TABLE cities TO golang; The function db.Prepare is used to prepare data. It specifies the query for insertion in advance. To insert data, use the function stmt.Exec. In Go, it's common to use plain SQL without using the ORM (Object-Relational Mapping) approach. stmt, err := db.Prepare("INSERT INTO Cities(city_id, city_name, city_population) VALUES($1, $2, $3)") if err != nil { log.Fatal(err) } defer stmt.Close() _, err = stmt.Exec(1, "Toronto", 279435) if err != nil { log.Fatal(err) } fmt.Println("Data inserted successfully!") } If all works correctly, you will see: Data inserted successfully! Redis and Go To connect to Redis, you need to use the go-redis driver. Š”reate a new directory: mkdir connect-to-redis && cd connect-to-redis Prepare the dependency file: go mod init golang-connect-redis And optimize them: go mod tidy Download the go-redis module: go get github.com/go-redis/redis/v8 To connect to Redis, use the redis.Options function to specify the address and port of the Redis server. Since Redis does not use authentication by default, you can leave the Password field empty and use the default database (database 0): package main import ( "context" "fmt" "log" "github.com/go-redis/redis/v8" ) func main() { rdb := redis.NewClient(&redis.Options{ Addr: "91.206.179.128:6379", Password: "", DB: 0, }) ctx := context.Background() _, err := rdb.Ping(ctx).Result() if err != nil { log.Fatalf("Couldn't connect to Redis: %v", err) } fmt.Println("Successfully connected to Redis!") } You should see the message «Successfully connected to Redis!» MongoDB and Go To work with MongoDB, we'll use the mongo driver. Create a new directory to store the project structure: mkdir connect-to-mongodb && cd connect-to-mongodb Initialize the dependency file: go mod init golang-connect-mongodb Download the mongo library: go get go.mongodb.org/mongo-driver/mongo Connect to MongoDB using the options.Client().ApplyURI method. It takes a connection string such as mongodb://91.206.179.29:27017, where 91.206.179.29 is the MongoDB server address and 27017 is the port for connecting to MongoDB. The options.Client().ApplyURI string is used only for specifying connection data. To check the connection status, you can use another function, client.Ping, which shows the success or failure of the connection: package main import ( "context" "fmt" "log" "time" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) func main() { clientOptions := options.Client().ApplyURI("mongodb://91.206.179.29:27017") client, err := mongo.Connect(context.TODO(), clientOptions) if err != nil { log.Fatalf("Couldn't connect to MongoDB server: %v", err) } fmt.Println("successfully connected to MongoDB!") ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() err = client.Ping(ctx, nil) if err != nil { log.Fatalf("Could not ping MongoDB server: %v", err) } fmt.Println("Ping MongoDB server successfully!") } You should see the message: successfully connected to MongoDB!Ping MongoDB server successfully MongoDB uses collections to store data. You can create collections using the .Collection function.  Below, we will create a database called first-database and a collection called first-collection. The collection will have a new document, containing three keys: user-name, user-age, and user-email. collection := client.Database("first-database").Collection("first-collection") document := map[string]interface{}{ "user-name": "Alice", "user-age": 25, "user-email": "alice@corporate.com", } insertResult, err := collection.InsertOne(ctx, document) if err != nil { log.Fatalf("Couldn't insert new document: %v", err) } fmt.Printf("Inserted new document with ID: %v\n", insertResult.InsertedID) if err := client.Disconnect(ctx); err != nil { log.Fatalf("Could not disconnect from MongoDB: %v", err) } fmt.Println("Disconnected from MongoDB!") } If successful, you will see the Inserted new document message with the document ID.  ClickHouse and Go To work with ClickHouse, use the clickhouse-go driver. Create a new directory to store the project files and navigate to it: clickhouse-connect && cd clickhouse-connect Create a go.mod file to store the dependencies: go mod init golang-connect-clickhouse Download the Clickhouse driver using the command: go get github.com/ClickHouse/clickhouse-go/v2 Create a new file named main.go, where you will specify the connection data to ClickHouse. package main import ( "database/sql" "log" "github.com/ClickHouse/clickhouse-go/v2" ) func main() { dsn := "tcp://localhost:9000?username=user1&password=PasswordForuser175465&database=new_db" db, err := sql.Open("clickhouse", dsn) if err != nil { log.Fatal(err) } defer db.Close() if err := db.Ping(); err != nil { log.Fatal(err) } log.Println("Connected to ClickHouse!") } Database Connection in JavaScript In JavaScript, all connections to external services are made using the Node.js platform. Make sure that you have Node.js and the npm package manager installed on your device. MySQL and JavaScript To work with MySQL, use the mysql2 driver. Create a directory where we will store the project files: mkdir js-mysql-connect && cd js-mysql-connect Initialize the project: npm init -y Install the mysql2 library: npm install mysql2 Use the following code to connect to MySQL: const mysql = require('mysql2'); const connection_to_mysql = mysql.createConnection({ host: 'localhost', user: 'root', password: 'PasswordForRoot74463', database: db1, }); connection_to_mysql.connect((err) => { if (err) { console.error('Error connecting to MySQL:', err.message); return; } console.log('Successfully connected to MySQL Server!'); connection_to_mysql.end((endErr) => { if (endErr) { console.error('Error closing the connection_to_mysql:', endErr.message); } else { console.log('Connection closed.'); } }); }); PostgreSQL and JavaScript Connecting to PostgreSQL is done using the pg library. Create a directory where we will store the project files: mkdir js-postgres-connect && cd js-postgres-connect Initialize the project: npm init -y Install the pg library: npm install pg To connect to PostgreSQL, first import the pg library. Then, create a constant where you specify variables for the database address, username, password, database name, and port. Use the new pg.Client class to pass the connection data. We will create a table called cities and add two records into it. To do this, we will use the queryDatabase function, which contains the SQL queries. const pg = require('pg'); const config = { postgresql_server_host: '91.206.179.29', postgresql_user: 'gen_user', postgresql_user_password: 'PasswordForGenUser56467$', postgresql_database_name: 'default_db', postgresql_database_port: 5432, }; const client = new pg.Client(config); client.connect(err => { if (err) throw err; else { queryDatabase(); } }); function queryDatabase() { const query = ` DROP TABLE IF EXISTS cities; CREATE TABLE cities (id serial PRIMARY KEY, name VARCHAR(80), population INTEGER); INSERT INTO cities (name, population) VALUES ('Berlin', 3645000); INSERT INTO cities (name, population) VALUES ('Paris', 2161000); `; client .query(query) .then(() => { console.log('Table created successfully!'); client.end(console.log('Closed client connection')); }) .catch(err => console.log(err)) .then(() => { console.log('Finished execution, exiting now'); process.exit(); }); } Use this command to run the code: node connect-to-postgres.js Redis and JavaScript To work with Redis, use the ioredis library. Create a directory to store the project files: mkdir js-redis-connect && cd js-redis-connect Initialize the project: npm init -y Install the ioredis library: npm install ioredis To connect to Redis, import the ioredis library. Then create a constant named redis and specify the Redis server address. Inserting data, i.e., creating key-value objects, is done using an asynchronous function named setData, which takes two values — key and value, corresponding to the data format of the Redis system. const Redis = require('ioredis'); const redis = new Redis({ host: '91.206.179.29', port: 6379, password: 'UY+p8e?Kxmqqfa', }); async function setData(key, value) { try { await redis.set(key, value); console.log('Data successfully set'); } catch (error) { console.error('Error setting data:', error); } } async function getData(key) { try { const value = await redis.get(key); console.log('Data retrieved'); return value; } catch (error) { console.error('Error getting data:', error); } } (async () => { await redis.select(1); await setData('user', 'alex'); await getData('user'); redis.disconnect(); })(); Run: node connect-to-redis.js MongoDB and JavaScript To work with MongoDB, use the mongodb driver. Create a directory for storing the project files: mkdir js-mongodb-connect && cd js-mongodb-connect Initialize the project: npm init -y Install the mongodb library: npm install mongodb To connect to MongoDB, import the mongodb library. Specify the database address in the constant uri and pass the address into the MongoClient class. const { MongoClient } = require('mongodb'); const uri = "mongodb://91.206.179.29:27017"; const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true }); async function connectToDatabase() { try { await client.connect(); console.log("Successfully connected to MongoDB!"); const database = client.db("myDatabase"); const collection = database.collection("myCollection"); const documents = await collection.find({}).toArray(); console.log("Documents found:", documents); } catch (error) { console.error("Error connecting to MongoDB:", error); } finally { await client.close(); console.log("Connection closed."); } } connectToDatabase(); ClickHouse and JavaScript To work with ClickHouse, use the clickhouse/client driver. Create a directory where we will store the project files: mkdir js-clickhouse-connect && cd js-clickhouse-connect Initialize the project: npm init -y Install the @clickhouse/client library: npm install @clickhouse/client To connect to ClickHouse, use the code below where we set the connection details and execute a simple SQL query that will return the first 10 records from the system table named system.tables: const { ClickHouse } = require('@clickhouse/client'); const client = new ClickHouse({ host: 'http://localhost:8123', username: 'default', password: 'PasswordforDefaultUser45435', database: 'default', }); async function connectAndQuery() { try { console.log('Successfully connected to ClickHouse Server!'); const rows = await client.query({ query: 'SELECT * FROM system.tables LIMIT 10', format: 'JSON', }).then((result) => result.json()); console.log('Query results:', rows); } catch (error) { console.error('Error Successfully connected to ClickHouse Server! or running the query:', error); } finally { console.log('Done.'); } } connectAndQuery(); Conclusion In today's article, we thoroughly explored how to connect to PostgreSQL, Redis, MongoDB, MySQL, and ClickHouse databases using Python, Go, and JavaScript. These languages can be used to create both web applications and microservices that utilize databases in their operation.
18 February 2025 Ā· 23 min to read

Do you have questions,
comments, or concerns?

Our professionals are available to assist you at any moment,
whether you need help or are just unsure of where to start.
Email us
Hostman's Support