DeveloperBreeze

Configuring SQLAlchemy with PostgreSQL on Heroku: A Quick Guide

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import os

app = Flask(__name__)

# Adjust the DATABASE_URL format for SQLAlchemy compatibility
database_url = os.getenv("DATABASE_URL", "")
if database_url.startswith("postgres://"):
    database_url = database_url.replace("postgres://", "postgresql+psycopg2://")

app.config["SQLALCHEMY_DATABASE_URI"] = database_url

# Initialize the SQLAlchemy object
db = SQLAlchemy(app)

# Sample route to test the setup
@app.route("/")
def index():
    return "Database URI setup complete!"

if __name__ == "__main__":
    app.run()

Explanation:

  • This code retrieves the DATABASE_URL from the environment.
  • If DATABASE_URL starts with postgres://, it replaces it with postgresql+psycopg2://.
  • The db instance is initialized with SQLAlchemy(app) for use with SQLAlchemy ORM.
  • The replacement of "postgres://" with "postgresql+psycopg2://" is necessary because of a compatibility issue between the URI format provided by Heroku and the URI format expected by SQLAlchemy.

Background:

  1. Heroku's DATABASE_URL:
  • When you provision a PostgreSQL database on Heroku, it sets an environment variable called DATABASE_URL with the connection string for your database.
  • This URI uses the format postgres://.
  1. SQLAlchemy's Expectation:
  • SQLAlchemy (especially when using the psycopg2 driver for PostgreSQL) requires the URI to be in the format postgresql+psycopg2://.
  • This prefix specifies the dialect (postgresql) and the driver (psycopg2) explicitly, which SQLAlchemy uses to establish the connection.

Why the Replacement?

Heroku's DATABASE_URL uses the older postgres:// scheme, which isn't compatible with the latest SQLAlchemy requirements. Starting with SQLAlchemy 1.4, postgres:// is considered deprecated and no longer supported. The explicit postgresql+psycopg2:// scheme is required.

Without this replacement, SQLAlchemy might throw an error like:

ValueError: Could not parse rfc1738 URL from string 'postgres://...'

The Code:

if database_url.startswith("postgres://"):
    database_url = database_url.replace("postgres://", "postgresql+psycopg2://")

This code ensures that:

  • If the DATABASE_URL starts with postgres:// (Heroku's default), it replaces it with the correct format, postgresql+psycopg2://, making the URI compatible with SQLAlchemy.

Alternatives:

Instead of manually replacing the URI, you can use libraries like dj-database-url to parse and adapt the DATABASE_URL for different frameworks or drivers. However, the manual approach is straightforward and works well for most cases.

Continue Reading

Discover more amazing content handpicked just for you

Tutorial

How to view tables on a PostgreSQL database hosted on Heroku

   SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';

Using either method will allow you to view and interact with your PostgreSQL tables on Heroku.

Nov 06, 2024
Read More
Tutorial

How to view your Heroku Apps

This will display a list of all the Heroku apps associated with your account.

Open your browser and go to dashboard.heroku.com.

Nov 06, 2024
Read More
Tutorial

Connecting a Node.js Application to an SQLite Database Using sqlite3

With the database connection established, the next step is to create the "accounts" table with the specified columns: private_key, address, decimalNumber, and has_transactions.

Add the following code to your app.js file after establishing the database connection:

Oct 24, 2024
Read More
Article

Comparing AWS, DigitalOcean, Heroku, and Vercel: Understanding Cloud Service Providers and Their Offerings

DigitalOcean is a developer-centric cloud infrastructure provider that simplifies the process of deploying and managing virtual servers (Droplets). It is popular among small to medium-sized businesses and developers because of its simplicity, affordable pricing, and intuitive user interface. While DigitalOcean primarily focuses on IaaS, it allows developers to set up scalable virtual machines quickly and efficiently.

DigitalOcean is ideal for users who need straightforward hosting solutions with a focus on virtual private servers, databases, and Kubernetes. Although it lacks the extensive service catalog of AWS, it provides everything needed for small to medium-scale applications at an affordable rate.

Oct 24, 2024
Read More
Cheatsheet

Heroku CLI Cheat Sheet

List all add-ons for an app.

heroku addons:create addon-name

Aug 01, 2024
Read More
Code
php

MySQLi Database Connection and Query

No preview available for this content.

Jan 26, 2024
Read More
Code
php

MySQL Database Query and Result Processing

No preview available for this content.

Jan 26, 2024
Read More

Discussion 0

Please sign in to join the discussion.

No comments yet. Start the discussion!