Connecting to PostgreSQL
PostgreSQL is a powerful open-source relational database. flAPI can query PostgreSQL databases directly or cache results for high-performance API serving.
Setup
# flapi.yaml
connections:
postgres-db:
init: |
INSTALL postgres;
LOAD postgres;
properties:
host: localhost
port: 5432
database: mydb
username: ${POSTGRES_USER}
password: ${POSTGRES_PASSWORD}
Environment Variables
Store sensitive credentials in environment variables:
export POSTGRES_USER=myuser
export POSTGRES_PASSWORD=mypassword
# flapi.yaml
template:
environment-whitelist:
- '^POSTGRES_.*'
Querying PostgreSQL
Using postgres_scan
-- Query a PostgreSQL table
SELECT *
FROM postgres_scan('mydb', 'public', 'users')
WHERE active = true
{{#params.role}}
AND role = '{{{params.role}}}'
{{/params.role}}
Connection String
You can also use a connection string:
connections:
postgres-db:
init: |
INSTALL postgres;
LOAD postgres;
properties:
connection_string: 'postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@localhost:5432/mydb'
Example: User API
Endpoint (sqls/users.yaml
):
url-path: /users/
request:
- field-name: role
field-in: query
required: false
validators:
- type: string
enum: ['admin', 'user', 'guest']
- field-name: active
field-in: query
required: false
validators:
- type: boolean
template-source: users.sql
connection:
- postgres-db
Template (sqls/users.sql
):
SELECT
id,
username,
email,
role,
created_at
FROM postgres_scan('mydb', 'public', 'users')
WHERE 1=1
{{#params.active}}
AND active = {{{params.active}}}
{{/params.active}}
{{#params.role}}
AND role = '{{{params.role}}}'
{{/params.role}}
ORDER BY created_at DESC
LIMIT 100
With Caching
For high-traffic APIs, cache PostgreSQL data:
Cache Template:
CREATE OR REPLACE TABLE {{cache.table}} AS
SELECT
user_id,
username,
email,
role,
last_login
FROM postgres_scan('mydb', 'public', 'users')
WHERE active = true
Configuration:
cache:
enabled: true
table: users_cache
schedule: 15m # Refresh every 15 minutes
template_file: users_cache.sql
Connection Pooling
PostgreSQL connections are pooled automatically for performance:
connections:
postgres-db:
init: |
INSTALL postgres;
LOAD postgres;
properties:
host: localhost
database: mydb
username: ${POSTGRES_USER}
password: ${POSTGRES_PASSWORD}
pool:
min_size: 2
max_size: 10
idle_timeout: 300
Next Steps
- BigQuery Connection: Connect to BigQuery
- Parquet Files: Work with file formats
- Caching Setup: Cache PostgreSQL data