Search code examples
pythonjsonpostgresqlpostgresql-9.1plpython

How are import statements in plpython handled?


I have a plypython function which does some json magic. For this it obviously imports the json library.

Is the import called on every call to the function? Are there any performance implication I have to be aware of?


Solution

  • The import is executed on every function call. This is the same behavior you would get if you wrote a normal Python module with the import statement inside a function body as oppposed to at the module level.

    Yes, this will affect performance.

    You can work around this by caching your imports like this:

    CREATE FUNCTION test() RETURNS text
    LANGUAGE plpythonu
    AS $$
    if 'json' in SD:
        json = SD['json']
    else:
        import json
        SD['json'] = json
    
     return json.dumps(...)
    $$;
    

    This is admittedly not very pretty, and better ways to do this are being discussed, but they won't happen before PostgreSQL 9.4.