# Python This package provides a wrapper over `psycopg2` connection which provides CRUD operations for resources in Fhirbase. ## Installation You can install the package using PyPI: ```python pip install fhirbase ``` ## Usage Import `fhirbase` and `psycopg2` libraries: ```python import fhirbase import psycopg2 ``` Create a connection using `psycopg2.connect`: ```python connection = psycopg2.connect( dbname='postgres', user='postgres', host='localhost', port='5432') ``` Create an instance of `FHIRBase`: ```python fb = fhirbase.FHIRBase(connection) ``` Now you can use the following methods of `FHIRBase` instance: * `.execute(sql, params=None, commit=False)` * `.execute_without_result(sql, params=None, commit=False)` * `.row_to_resource(row)` CRUD methods work with [FHIR resources](https://www.hl7.org/fhir/resourcelist.html). A resource represented as a dict with a specified `resourceType` key as a required key.The following methods works with a resource and returns resources. * `.create(resource, txid=None, commit=True)` * `.update(resource, txid=None, commit=True)` * `.delete(resource, txid=None, commit=True) / .delete(resource_type, id, txid=None, commit=True)` * `.read(resource)`_/_`.read(resource_type, id)` `.list(sql, params=None)` ## Methods #### .execute Executes sql with params. Syntax: `.execute(sql, params=None, commit=False)` Returns: context manager with a cursor as context Example: ```python with fb.execute('SELECT * FROM patient WHERE id=%s', ['id']) as cursor: print(cursor.fetchall()) ``` #### .execute\_without\_result Executes sql with params. Syntax: `.execute_without_result(sql, params=None, commit=False)` Returns: nothing Example: ```python fb.execute_without_result('INSERT INTO transaction (resource) VALUES (%s)', ['{}']) ``` #### .row\_to\_resource Transforms a raw row from DB to resource. Syntax: `.row_to_resource(row)` Returns: resource representation (dict) Example: ```python fb.row_to_resource({ 'resource': {'name': []}, 'ts': 'ts', 'txid': 'txid', 'resource_type': 'Patient', 'meta': {'tag': 'created'}, 'id': 'id', })) ``` will return a resource representation: ```python { 'id': 'id', 'meta': {'lastUpdated': 'ts', 'versionId': 'txid'}, 'name': [], 'resourceType': 'Patient', } ``` #### .create Creates a resource. If `txid` is not specified, a new unique logical transaction id will be generated. Syntax: `.create(resource, txid=None, commit=True)` Returns: resource representation (dict) Example: ```python fb.create({ 'resourceType': 'Patient', 'name': [{'text': 'John'}], }) ``` returns: ```python { 'resourceType': 'Patient', 'id': 'UNIQUE ID', 'name': [{'text': 'John'}], 'meta': {'lastUpdated': 'timestamp', 'versionId': 'txid'}, } ``` #### .update Updates a resource. If `txid` is not specified, a new unique logical transaction id will be generated. Key `id` is required in `resource` argument. Syntax: `.update(resource, txid=None, commit=True)` Returns: resource representation (dict) Example: ```python fb.update({ 'resourceType': 'Patient', 'id': 'id', 'name': [{'text': 'John'}], }) ``` returns: ```python { 'resourceType': 'Patient', 'id': 'UNIQUE ID', 'name': [{'text': 'John'}], 'meta': {'lastUpdated': 'timestamp', 'versionId': 'txid'}, } ``` #### .delete Deletes a resource. If `txid` is not specified, a new unique logical transaction id will be generated. Keys `id` and `resourceType` are required in `resource` argument in the first variant of an usage. Syntax: `.delete(resource, txid=None, commit=True)` or `.delete(resource_type, id, txid=None, commit=True)` Returns: nothing Example: ```python fb.delete({ 'resourceType': 'Patient', 'id': 'id', }) ``` or: ```python fb.delete(resource_type='Patient', id='id') ``` #### .read Reads a resource. Keys `id` and `resourceType` are required in `resource` argument in first variant of usage. Syntax: `.read(resource)` or `.read(resource_type, id)` Returns: resource representation (dict) Example: ```python fb.read({ 'resourceType': 'Patient', 'id': 'id', }) ``` or: ```python fb.read(resource_type='Patient', id='id') ``` #### .list Executes SQL and returns an iterator of resources. Note: sql query must return all fields of a resource table. Syntax: `.list(sql, params)` Returns: iterator of resources Example: ```python for patient in fb.list('SELECT * FROM patient'): print(patient) ``` or: ```python patients = list(fb.list('SELECT * FROM patient')) ``` ## Example To run example, just do: ```bash git clone https://github.com/fhirbase/fhirbase.py.git cd fhirbase.py ​ docker-compose build docker-compose up -d ``` Wait until db starting process will be completed, and run: ```bash docker-compose run --rm fhirbase fhirbase init 3.0.1 docker-compose run --rm fhirbasepy python examples/example.py ```