Skip to content

PostgreSQL node example #26

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
Mar 14, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ Table of Contents:
| **[Redis TLS](functions/redis-tls/README.md)** <br/> How to connect a function to a Scaleway Redis cluster with TLS enabled. | python310 | [Serverless Framework] |
| **[Rust MNIST](functions/rust-mnist/README.md)** <br/> A Rust function to recognize hand-written digits with a simple neural network. | rust165 | [Serverless Framework] |
| **[Terraform Python](functions/terraform-python-example/README.md)** <br/> A Python function deployed with Terraform. | python310 | [Terraform] |
| **[PostgeSQL Node](functions/postgre-sql-node/README.md)** <br/> A Node function to connect and interact with PostgreSQL database. | node18 | [Serverless Framework] |

### 📦 Containers

Expand Down
60 changes: 60 additions & 0 deletions functions/postgre-sql-node/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# Interact with a PostgreSQL database using functions

## Requirements

This example assumes that you are familiar with some products of Scaleway's ecosystem:
* how serverless functions work. If needed, you can check [Scaleway official documentation](https://www.scaleway.com/en/docs/serverless/functions/quickstart/).
* how a managed database for PostgreSQL works, and especially how to create a database and create users with appropriate permissions. Please refer to scaleway's documentation [here](https://www.scaleway.com/en/docs/managed-databases/postgresql-and-mysql/quickstart/).

This example uses the Scaleway Serverless Framework Plugin. Please set up your environment with the requirements stated in the [Scaleway Serverless Framework Plugin](https://github.com/scaleway/serverless-scaleway-functions) before trying out the example.


## Context

This example shows how to connect to a managed PostgreSQL database and perform a query on it. This example can be extended to adding, deleting, or processing data within a database.


## Description

The function connects to a PostgreSQL database and performs an example query on it. This example uses Node 18 runtime. Used packages are specified in `package.json`.

## Setup

### Create a managed PostgreSQL database

Create a PostgreSQL database and a user profile with appropriate access permissions.

### Fill environment variables

Fill your secrets within `serverless.yml` file:

```
secret:
PG_HOST: "your host IP address"
PG_USER: "your database username"
PG_DATABASE: "your database name"
PG_PASSWORD: "your databse user password"
PG_PORT: "your database port"
```

### Install npm modules

Once your environment is set up, you can install `npm` dependencies from `package.json` file using:

```
npm install
```

### Deploy and call the function

Then deploy your function and get its URL using:

```
serverless deploy
```

From the given function URL, you can run your function using:

```
curl <function URL>
```
53 changes: 53 additions & 0 deletions functions/postgre-sql-node/handler.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
const pg = require('pg')

const PG_HOST=process.env.PG_HOST;
const PG_USER=process.env.PG_USER;
const PG_DATABASE=process.env.PG_DATABASE;
const PG_PASSWORD=process.env.PG_PASSWORD;
const PG_PORT=parseInt(process.env.PG_PORT,10);

const pool = new pg.Pool({
user: PG_USER,
host: PG_HOST,
database: PG_DATABASE,
password: PG_PASSWORD,
port: PG_PORT
})

exports.handle = async (event, context, callback) => {
try {
const { rows } = await query("SELECT * FROM table LIMIT 10")
console.log(JSON.stringify(rows[0]))
const response = {
"statusCode": 200,
"headers": {
"Content-Type" : "application/json"
},
"body": JSON.stringify(rows),
"isBase64Encoded": false
};
callback(null, response);
} catch (err) {
console.log('Database ' + err)
callback(err);
}
};

async function query (q) {
const client = await pool.connect()
let res
try {
await client.query('BEGIN')
try {
res = await client.query(q)
await client.query('COMMIT')
} catch (err) {
await client.query('ROLLBACK')
throw err
}
} finally {
client.release()
}

return res
}
15 changes: 15 additions & 0 deletions functions/postgre-sql-node/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"name": "postgreSQL-node-example",
"version": "1.0.0",
"main": "handler.js",
"type": "commonjs",
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"pg": "^8.10.0"
},
"devDependencies": {
"serverless-scaleway-functions": "^0.4.6"
}
}
25 changes: 25 additions & 0 deletions functions/postgre-sql-node/serverless.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
service: scaleway-node18
configValidationMode: off
singleSource: false
provider:
name: scaleway
runtime: node18

secret:
PG_HOST: "your host IP address"
PG_USER: "your database username"
PG_DATABASE: "your database name"
PG_PASSWORD: "your databse user password"
PG_PORT: "your database port"

plugins:
- serverless-scaleway-functions

package:
patterns:
- '!.gitignore'
- '!.git/**'

functions:
get-all-from-table
handler: handler.handle