Releases
July 2, 2025

Quix Streams Release 3.18.0

Quix Streams v3.18.0 introduces a powerful new feature for enriching streaming data with PostgreSQL lookups.

Steve Rosam
Steve Rosam
Head of Content
QuixStreams 3.18.0, PostgreSQL Lookup Joins

Python stream processing, simplified

Pure Python. No JVM. No wrappers. No cross-language debugging. Use streaming DataFrames and the whole Python ecosystem to build stream processing applications.

Python stream processing, simplified

Pure Python. No JVM. No wrappers. No cross-language debugging. Use streaming DataFrames and the whole Python ecosystem to build stream processing applications.

Data integration, simplified

Ingest, pre-process and load high volumes of data into any database, lake or warehouse, without overloading your systems or budgets.

The 4 Pillars of a Successful AI Strategy

Foundational strategies that leading companies use to overcome common obstacles and achieve sustained AI success.
Get the guide

Guide to the Event-Driven, Event Streaming Stack

Practical insights into event-driven technologies for developers and software architects.
Get the guide
Quix is a performant, general-purpose processing framework for streaming data. Build real-time AI applications and analytics systems in fewer lines of code using DataFrames with stateful operators and run it anywhere Python is installed.

Quix Streams v3.18.0: Introducing PostgreSQL Lookup Joins for Real-time Data Enrichment

We're excited to announce the release of Quix Streams v3.18.0, which introduces a powerful new feature for enriching streaming data with PostgreSQL lookups. This release continues our program of making it easier and faster to join time-series data with other real-time data or slow moving and static data.

PostgreSQL Lookup Joins

The highlight of this release is the new `PostgresLookup`, which enables enrichment of streaming data with information from PostgreSQL databases. This feature is particularly valuable for scenarios where you need to enhance streaming data with reference data or additional context stored in a relational database.

Key Benefits

1. Efficient Data Enrichment: Enrich streaming data with reference data from PostgreSQL in real-time

2. Built-in Caching: Implements an LRU (Least Recently Used) cache with configurable TTL to minimize database load

3. Persistent Connections: Maintains efficient database connections for optimal performance

4. Simple Integration: Easily add database-backed lookups to your streaming pipelines with minimal code

How It Works

Here's a quick example of how to use the new PostgreSQL Lookup feature:

from quixstreams import Application 
from quixstreams.dataframe.joins.lookups.postgresql import PostgresLookup 

app = Application(...) 
sdf = app.dataframe(...) 

# Initialize PostgresLookup with your database credentials
lookup = PostgresLookup(
    host="<host>",
    port=5432,
    dbname="<db>",
    user="<user>",
    password="<password>",
    cache_size=1000,
)

# Define the fields to join from the database
fields = {
    "joined": lookup.field(
        table="my_table",
        columns=["table_column1", "table_column2"],
        on="table_column1"
    ),
}

# Perform the lookup join
sdf = sdf.join_lookup(lookup, fields, on="my_record_field")

app.run()

Use Cases

- Real-time Customer Data Enrichment: Enhance streaming events with customer profiles stored in PostgreSQL

- Reference Data Lookups: Join streaming data with reference data like product catalogs or pricing information

- Contextual Enrichment: Add additional context to events based on historical data

Bug Fixes

- Fixed a typo in the Producer class

Getting Started

To start using the new PostgreSQL Lookup feature, upgrade to Quix Streams v3.18.0:

pip install --upgrade quixstreams

For more detailed information, check out the PostgresLookup API documentation.

We're excited to see how you'll use this new capability to enhance your real-time data processing pipelines. If you have any questions or feedback, feel free to reach out on our GitHub repository. (And please leave a⭐)

What’s a Rich Text element?

The rich text element allows you to create and format headings, paragraphs, blockquotes, images, and video all in one place instead of having to add and format them individually. Just double-click and easily create content.

Static and dynamic content editing

A rich text element can be used with static or dynamic content. For static content, just drop it into any page and begin editing. For dynamic content, add a rich text field to any collection and then connect a rich text element to that field in the settings panel. Voila!

How to customize formatting for each rich text

Headings, paragraphs, blockquotes, figures, images, and figure captions can all be styled after a class is added to the rich text element using the "When inside of" nested selector system.