Usage

Terminology

Access Control List (ACL)

pg_grant uses Access Control List, or ACL, to refer to a list of privileges in string form.

acl = ['alice=arw/alice', 'bob=ar*/alice']
ACL item

A single item in an Access Control List

acl_item = 'alice=arw/alice'

Parsing

Single ACL items can be parsed using parse_acl_item():

>>> from pg_grant import parse_acl_item
>>> parse_acl_item('bob=arw*/alice')
Privileges(grantee='bob', grantor='alice', privs=['SELECT', 'INSERT'], privswgo=['UPDATE'])

Access Control Lists can be parsed using parse_acl():

>>> from pg_grant import parse_acl
>>> parse_acl(['alice=a/alice', 'bob=a/alice'])
[Privileges(grantee='alice', grantor='alice', privs=['INSERT'], privswgo=[]),
 Privileges(grantee='bob', grantor='alice', privs=['INSERT'], privswgo=[])]

Querying

The pg_grant.query submodule has functions for loading ACLs for many types of database object. These functions use an SQLALchemy connection:

>>> from pg_grant import query as q
>>> q.get_all_table_acls(engine, schema='public')
[SchemaRelationInfo(oid=138067, name='table2', owner='alice', acl=['bob=arw/alice'], schema='public')
 ...]
>>> q.get_table_acl(engine, 'table2')
SchemaRelationInfo(oid=138067, name='table2', owner='alice', acl=['bob=arw/alice'], schema='public')

All of the functions return an object or list of objects with acl attributes that can be parsed with parse_acl().

When an acl is None, it means that default privileges apply to the object:

>>> from pg_grant import PgObjectType, get_default_privileges
>>> from pg_grant import query as q
>>> q.get_table_acl(engine, 'table2')
SchemaRelationInfo(oid=138067, name='table2', owner='alice', acl=None, schema='public')
>>> get_default_privileges(PgObjectType.TABLE, owner='alice')
[Privileges(grantee='alice', grantor='alice', privs=['ALL'], privswgo=[])]