Skip to content

Florents-Tselai/babar

Repository files navigation

Logo

Babar🐘❤️🐍

Turn any Python object into a Postgres extension

Status | Why | How | Installation | Usage | Roadmap

Status

WARNING: This is a work in progress and is far from doing what it promises. But not that far... 😉

Why

Postgres has supported Python as a procedural language for years via PL/Python.

Embedding non-trivial Python code in Postgres can get cumbersome and usually involves copy-pasting from existing code bases and/or creating thin wrappers around existing functions.

babar automates this process by allowing you to seamlessly package existing Python components (functions, classes etc.) int a postgres extension.

How

babar dynamically inspects the definition of Python objects and generates semantically equivalent Postgres definitions along with the necessary extension files (.control, Makefile, .sql)

Installation

Usage

pip install pybabar

Let's create a Postgres extension called pystring which adds a few Python functions.

from babar import Extension

def pyconcat(x: str, y: str) -> str:
    return x + y

def pyupper(x: str) -> str:
    return x.upper()

if __name__ == "__main__":
    Extension(
        "pystring",
        pyconcat, pyupper,
        comment="this is the pystring extension",
        default_version="0.1.0",
    )

Then, from the command line, you can run:

python pystring.py

That will create the appropriate extension files, which you can then install in the usual Postgres way:

make 
make install

Then you can CREATE the extension and use it

psql -d postgres <<SQL
CREATE EXTENSION pystring

SELECT pyconcat('hello ', 'world');
SELECT pyupper('hello');
SQL

Roadmap

v0.1.0 (wip)

  • simple functions (not classes, methods etc)
  • Functions should be 100% self-contained (outer scope is not inspected)
  • primitive types only: support only str/text as arg and return
  • Probably no cli interface / just python main.py

Future

  • @pg_function decorator for individual functions. Much like click;
  • maybe subclass Extension should make a whole Python class an extension?
  • CLI like babar -m pack.mod.func1 pack2.mod2.func2
  • Handle upgrades
  • pgxn integration

It is lightly inspired by Python-Fire which turns any Python object into a cli interface