Skip to main content

postgres-dynamic - Python-PostgreSQL Dynamic Query Builder

Postgres dynamic is a simple query builder developed for internal usage. It currently supports select, insert, update, and delete statements. The purpose of this library is for better managament and maintenance of the code used in our environment.

Installation

$ pip install postgres-dynamic

---> 100%

Parameter Format:

  • connection_object: Callable

    connection_object = psycopg2.connect(host,port,database,user,password) #object created from psycopg2.connect()
    
  • where: List(dict)

    where = [
        {
            'column_name': 'some_column_name', 
            'value': 'some_value', # can accept str, int, list, or tuple
            'operator': 'some_operator', # can be omitted (accepted operators are =, >, <, >=, <=, IN),
            'conjunction': 'some_conjunction', # can be omitted, used when you need to specify more than one conditions and will link with next index value (accepted conjunctions are AND, OR)
        },
    ],
    
  • main_table: Union[dict, str]

    For select query

    main_table = {
        'table': 'some_table_name', 
        'alias': 'some_alias_for_table',
    },
    

    For transaction query

    main_table = 'some_table_name'
    
  • join_table: List(dict)

    join_table = [
        {
            'table': 'some_table_name', 
            'alias': 'some_alias_for_table', 
            'join_method': 'join_method', # accepted join methods are (INNER, LEFT, RIGHT, FULL) 
            'on': 'matching_column_on_both_table',
        },
    ]
    
  • column_name: List(str)

    column_name = ['some_column_name', 'some_column_name', 'some_column_name',]
    
  • column_and_value: dict

    column_and_value = {
        'some_column_name': 'some_value', # for multiple values just provide more key:value pair 
    }
    
  • order: dict

    order = {
        'some_column_name': 'ASC', # accepted order values are (ASC, DESC), for multiple order conditions just provide more key:value pair 
    }
    

Usage & Code Samples

Example DB

table: employees

id first_name last_name
1 Alex Garcia
2 Joe Black
3 John Doe
4 Barry Allen
5 Charlie Cox

table: salaries

employee_id salary
1 120,000
2 135,000
3 150,000
4 180,000
5 120,000
  • SELECT

    • Single Select
      Single select always return a single value from the query, based on fetchone in psycopg2 and returning a dictionary with {column_name: value} of the tables.

      Show more...

      Parameters:

      main_table #required
      where #required
      join_table #optional (if omitted it won't join to any table)
      column_name #optional (if omitted it will select all columns on the provided table)
      

      Code samples:

      # without joining table
      
      from postgres_dynamic import PGDGet
      import asyncio
      
      query_result = PGDGet.get_one(
          main_table={'table': 'employees'},
          where=[
              {'column_name': 'id', 'value': '1'},
          ],
          column_name=['first_name']
      )
      
      result = asyncio.run(query_result)
      print(result)
      
      # {'first_name': 'Alex'}
      
      # with join table salaries
      
      query_result = PGDGet.get_one(
          main_table={'table': 'employees', 'alias': 'emp'},
          join_table=[
              {'table': 'salaries', 'alias': 'sal', 'join_method': 'INNER', 'on': 'emp.id = sal.employee_id'}
          ],
          where=[
              {'column_name': 'id', 'value': '1'},
          ],
      )
      
      result = asyncio.run(query_result)
      print(result)
      
      # {'id': '1', 'first_name': 'Alex', 'last_name': 'Garcia', 'employee_id': '1', 'salary': 120000}
      
    • Multi Select
      Multi select always return a dict with key data, based on fetchall in psycopg2 and returning a list of dictionary with {column_name: value} of the tables. Parameters:

      Show more...
      main_table #required
      where #optional (if omitted no condition will be passed)
      join_table #optional (if omitted it won't join to any table)
      column_name #optional (if omitted it will select all columns on the provided table)
      order #optional (if omitted it won't sort the query)
      limit #optional (if a limit count is given, no more than that many rows will be returned but possibly fewer, if the query itself yields fewer rows)
      offset #optional (it used to skip that many rows before beginning to return rows)
      
      notes:
      - If both OFFSET and LIMIT appear, then OFFSET rows are skipped before starting to count the LIMIT rows that are returned
      - When using LIMIT, it is important to use an ORDER BY clause that constrains the result rows into a unique order. Otherwise you will get an unpredictable subset of the query's rows.
      - For paging, you can specify 0 or 1 for the starting point of the first page
      

      Code samples:

      from postgres_dynamic import PGDGet
      import asyncio
      
      query_result = PGDGet.get_all(
          main_table={'table': 'employees'},
          limit=3,
          offset=2
      )
      
      result = asyncio.run(query_result)
      print(result)
      
      # {'data': [{'id': '4', 'first_name': 'Barry', 'last_name': 'Allen'}, {'id': '5', 'first_name': 'Charlie', 'last_name': 'Cox'}]}
      
    • Select count
      Select count always return a dict with key total_data, based on SELECT COUNT(*) in SQL and returning a dictionary with {total_data: value} of the query. Parameters:

      Show more...
      main_table #required
      where #optional (if omitted no condition will be passed)
      join_table #optional (if omitted it won't join to any table)
      

      Code samples:

      from postgres_dynamic import PGDGet
      import asyncio
      
      query_result = PGDGet.get_count(
          main_table={'table': 'employees'},
          where=[{'column_name': 'first_name', 'value': 'Alex'}]
      )
      
      result = asyncio.run(query_result)
      print(result)
      
      # {'total_data': 1}
      
  • INSERT

    • Insert Statement
      Insert will not return anyting, and will not saved changes to the database unless you specify commit=True in the parameters.

      Show more...

      Parameters:

      main_table #required
      column_and_value #required
      commit #optional (if omitted, default value will be False which will not saving any changes to database)
      

      Code samples:

      # with auto commit
      
      from postgres_dynamic import PGDTransaction
      import asyncio
      
      query_result = PGDTransaction.insert(
          main_table='employees',
          column_and_value={'id': 6, 'first_name': 'Harrison', 'last_name': 'Ford'},
          commit=True
      )
      
      result = asyncio.run(query_result)
      print(result)
      
      # None
      # will insert a new employee to the employees table
      
      # without auto commit
      
      query_result = PGDTransaction.insert(
          main_table='salaries',
          column_and_value={'employee_id': 6, 'salary': 250000},
      )
      
      result = asyncio.run(query_result)
      print(result)
      
      # None
      # will insert a new salary to the salaries table
      
      # save changes to the database
      connection_object.commit()
      
  • UPDATE

    • Update Statement
      Update will not return anyting, and will not saved changes to the database unless you specify commit=True in the parameters.

      Show more...

      Parameters:

      main_table #required
      column_and_value #required
      where #required
      commit #optional (if omitted, default value will be False which will not saving any changes to database)
      

      Code samples:

      # with auto commit
      
      from postgres_dynamic import PGDTransaction
      import asyncio
      
      query_result = PGDTransaction.update(
          main_table='employees',
          column_and_value={'first_name': 'Tyler', 'last_name': 'Oakley'},
          where=[
              {'column_name': 'id', 'value': '6'},
          ],
          commit=True
      )
      
      result = asyncio.run(query_result)
      print(result)
      
      # None
      # will update employee first_name and last_name with id 6
      
      # without auto commit
      
      query_result = PGDTransaction.update(
          main_table='salaries',
          column_and_value={'salary': 450000},
          where=[
              {'column_name': 'employee_id', 'value': '6'},
          ],
      )
      
      result = asyncio.run(query_result)
      print(result)
      
      # None
      # will update the salary with employee_id 6
      
      # save changes to the database
      connection_object.commit()
      
  • DELETE

    • Delete Statement
      Delete will not return anyting, and will not saved changes to the database unless you specify commit=True in the parameters.

      Show more...

      Parameters:

      main_table #required
      where #required
      commit #optional (if omitted, default value will be False which will not saving any changes to database)
      

      Code samples:

      # with auto commit
      
      from postgres_dynamic import PGDTransaction
      import asyncio
      
      query_result = PGDTransaction.delete(
          main_table='salaries',
          where=[
              {'column_name': 'employee_id', 'value': '6'},
          ],
          commit=True
      )
      
      result = asyncio.run(query_result)
      print(result)
      
      # None
      # will delete salary data with employee_id 6
      
      # without auto commit
      
      query_result = PGDTransaction.delete(
          main_table='employees',
          where=[
              {'column_name': 'id', 'value': '6'},
          ],
      )
      
      result = asyncio.run(query_result)
      print(result)
      
      # None
      # will delete the employee with id 6
      
      # save changes to the database
      connection_object.commit()
      

Metadata

Release files for postgres-dynamic 0.0.11

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for postgres-dynamic 0.0.11
File Size Uploaded Provenance Actions
postgres-dynamic-0.0.11.tar.gz 8.5 kB Without provenance Details for postgres-dynamic-0.0.11.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for postgres-dynamic 0.0.11
File Interpreter ABI Platform Actions
postgres_dynamic-0.0.11-py3-none-any.whl Python 3 none any Details for postgres_dynamic-0.0.11-py3-none-any.whl

Total release size: 16.1 kB

Release files / postgres-dynamic-0.0.11.tar.gz

Download URL postgres-dynamic-0.0.11.tar.gz
Size 8.5 kB
Tags Source
SHA-256 checksum
How to use checksums
38db1a53b9b6de36cb5497cc4a875183fd134793412cd20f06b8ccdfe0365229
BLAKE2b-256 checksum
How to use checksums
027988dcff6ada781ccf6c0f9d21e6b04440d4373a2edc203eaefa58c939ff8b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.10.8

Release files / postgres_dynamic-0.0.11-py3-none-any.whl

Download URL postgres_dynamic-0.0.11-py3-none-any.whl
Size 7.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a4e1de22e65ac64fedc6651392a1efa280b39215bb3804f92aae88ccf9ddbe36
BLAKE2b-256 checksum
How to use checksums
fecc2a3084eef3b7317a8b0206c8b46be1032a65b3980554f55612e3dcc5c771
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.10.8

Security for postgres-dynamic 0.0.11

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page