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

Make sure you’re logged in to the Heroku CLI by running:

   heroku login

Nov 06, 2024
Read More
Tutorial

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

Add the following code to your app.js file within the db.serialize() block, after inserting data:

// Retrieve data from the "accounts" table
db.each('SELECT * FROM accounts', (err, row) => {
  if (err) {
    console.error('Error retrieving data:', err.message);
  } else {
    console.log(`Private Key: ${row.private_key}`);
    console.log(`Address: ${row.address}`);
    console.log(`Decimal Number: ${row.decimalNumber}`);
    console.log(`Has Transactions: ${row.has_transactions}`);
    console.log('---------------------------');
  }
});

Oct 24, 2024
Read More
Article

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

Vercel is particularly attractive for frontend developers using frameworks like Next.js or React. It integrates seamlessly with GitHub, providing continuous deployment features that make it easy to deploy changes as soon as they are pushed. Vercel’s strengths lie in its simplicity, speed, and the ability to handle static sites or lightweight applications effortlessly.

Each of these cloud service providers offers different benefits depending on your project requirements:

Oct 24, 2024
Read More
Cheatsheet

Heroku CLI Cheat Sheet

Push code from your local repository to Heroku (assuming main is your default branch).

heroku rollback

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!