Spaces:
Sleeping
Sleeping
import json | |
import psycopg2 | |
from tabulate import tabulate | |
class PostgresDB: | |
""" | |
A class to manage postgres connections and queries | |
""" | |
def __init__(self): | |
self.conn = None | |
self.cur = None | |
def __enter__(self): | |
return self | |
def __exit__(self, exc_type, exc_val, exc_tb): | |
if self.cur: | |
self.cur.close() | |
if self.conn: | |
self.conn.close() | |
def connect_with_url(self, url): | |
self.conn = psycopg2.connect(url) | |
self.cur = self.conn.cursor() | |
def close(self): | |
if self.cur: | |
self.cur.close() | |
if self.conn: | |
self.conn.close() | |
def run_sql(self, sql) -> str: | |
""" | |
Run a SQL query against the postgres database. | |
Returns JSON. | |
""" | |
self.cur.execute(sql) | |
columns = [desc[0] for desc in self.cur.description] | |
res = self.cur.fetchall() | |
list_of_dicts = [dict(zip(columns, row)) for row in res] | |
json_result = json.dumps(list_of_dicts, indent=4) | |
return json_result | |
# method to run a sql and return markdown | |
def run_sql_to_markdown(self, sql) -> str: | |
""" | |
Run a SQL query against the postgres database | |
Returns markdown table. | |
""" | |
self.cur.execute(sql) | |
columns = [desc[0] for desc in self.cur.description] | |
res = self.cur.fetchall() | |
list_of_dicts = [dict(zip(columns, row)) for row in res] | |
markdown_table = self.to_markdown(list_of_dicts) | |
print(markdown_table) | |
return markdown_table | |
def to_markdown(data) -> str: | |
""" | |
Convert a list of dictionaries to markdown | |
""" | |
return tabulate(data, headers="keys", tablefmt="pipe") | |