The following tutorial implements an ORM example using GORM, the ORM library for Golang, that implements a basic REST API server. The scenario is that of an e-commerce application. Database access in this application is managed using GORM.

The source for the above application can be found in the repository. There are a number of options that can be customized in the properties file located at src/config/config.json.

Prerequisites

This tutorial assumes that you have:

  • YugabyteDB up and running. Download and install YugabyteDB by following the steps in Quick start.
  • Go 1.21, or later, is installed. The latest releases are available on the Go Downloads page.

Clone the "orm-examples" repository

Clone the Yugabyte orm-examples repository by running the following command.

$ git clone https://github.com/YugabyteDB-Samples/orm-examples.git

Set up the application and install dependencies

Initialize Go within the project:

cd golang/gorm go mod init gorm-example

Download the included packages and dependencies:

go mod tidy

Build and run the application

Create the ysql_gorm database in YugabyteDB by running the following ysqlsh command from the YugabyteDB home directory.

$ ./bin/ysqlsh -c "CREATE DATABASE ysql_gorm"

Build and start the REST API server by running the following shell script. The application uses the YugabyteDB smart driver for Go, which provides the connection load balancing feature.

Note: The application also works with the upstream Go driver (jackc/pgx). To use it, replace github.com/yugabyte/gorm-yugabytedb with gorm.io/driver/postgres in the application code.

$ ./build-and-run.sh

The REST API server will start and listen for requests at http://localhost:8080.

Send requests to the application

Create 2 users.

$ curl --data '{ "firstName" : "John", "lastName" : "Smith", "email" : "jsmith@example.com" }' \ -v -X POST -H 'Content-Type:application/json' http://localhost:8080/users
$ curl --data '{ "firstName" : "Tom", "lastName" : "Stewart", "email" : "tstewart@example.com" }' \ -v -X POST -H 'Content-Type:application/json' http://localhost:8080/users

Create 2 products.

$ curl \ --data '{ "productName": "Notebook", "description": "200 page notebook", "price": 7.50 }' \ -v -X POST -H 'Content-Type:application/json' http://localhost:8080/products
$ curl \ --data '{ "productName": "Pencil", "description": "Mechanical pencil", "price": 2.50 }' \ -v -X POST -H 'Content-Type:application/json' http://localhost:8080/products

Create 2 orders.

$ curl \ --data '{ "userId": 2, "products": [ { "productId": 1, "units": 2 } ] }' \ -v -X POST -H 'Content-Type:application/json' http://localhost:8080/orders
$ curl \ --data '{ "userId": 2, "products": [ { "productId": 1, "units": 2 }, { "productId": 2, "units": 4 } ] }' \ -v -X POST -H 'Content-Type:application/json' http://localhost:8080/orders

Query results

Using the YSQL shell

$ ./bin/ysqlsh
ysqlsh (15.2-YB-2.25.0.0-b0)
Type "help" for help.

yugabyte=#
yugabyte=# SELECT count(*) FROM users;
 count
-------
     2
(1 row)
yugabyte=# SELECT count(*) FROM products;
 count
-------
     2
(1 row)
yugabyte=# SELECT count(*) FROM orders;
 count
-------
     2
(1 row)

Using the REST API

$ curl http://localhost:8080/users
{ "content": [ { "userId": 2, "firstName": "Tom", "lastName": "Stewart", "email": "tstewart@example.com" }, { "userId": 1, "firstName": "John", "lastName": "Smith", "email": "jsmith@example.com" } ], ... }
$ curl http://localhost:8080/products
{ "content": [ { "productId": 2, "productName": "Pencil", "description": "Mechanical pencil", "price": 2.5 }, { "productId": 1, "productName": "Notebook", "description": "200 page notebook", "price": 7.5 } ], ... }
$ curl http://localhost:8080/orders
{ "content": [ { "orderTime": "2019-05-10T04:26:54.590+0000", "orderId": "999ae272-f2f4-46a1-bede-5ab765bb27fe", "user": { "userId": 2, "firstName": "Tom", "lastName": "Stewart", "email": "tstewart@example.com" }, "userId": null, "orderTotal": 25, "products": [] }, { "orderTime": "2019-05-10T04:26:48.074+0000", "orderId": "1598c8d4-1857-4725-a9ab-14deb089ab4e", "user": { "userId": 2, "firstName": "Tom", "lastName": "Stewart", "email": "tstewart@example.com" }, "userId": null, "orderTotal": 15, "products": [] } ], ... }