0

I have 3 tables in Postgres.

table -> ledger

ledger is a tree structure.

enter image description here

table -> leaf

value of the tree leaf

enter image description here

table -> result

result of the tree aggregation

enter image description here

I want a python code to connect to postgresql database and aggregate the tree from leaf and ledger tables and insert the result into result table.

but in aggregation result name and code are not correct.

from typing import Optional
from sqlmodel import Field, Session, SQLModel, select  ,func
from sqlalchemy import create_engine

class Ledger(SQLModel, table=True):
    ledger_code: Optional[int] = Field(default=None, primary_key=True)
    name: str
    parent: int
    depth: Optional[int] = None
    ledger_code: Optional[int] = Field(
        default=None, foreign_key="Leaf.ledger_code", primary_key=True)
    ledger_code: Optional[int] = Field(
        default=None, foreign_key="Result.ledger_code", primary_key=True)


class Leaf(SQLModel, table=True):
    ledger_code: Optional[int] = Field(default=None, primary_key=True)
    value: int
    parent: int
    depth: Optional[int] = None
    ledger_code: Optional[int] = Field(
        default=None, foreign_key="Ledger.ledger_code", primary_key=True)


class Result(SQLModel, table=True):
    ledger_code: Optional[int] = Field(default=None, primary_key=True)
    depth: int
    parent: int
    value: int
    name: str
    creator: str

dbschema='public' # Searches left-to-right

engine = create_engine(
    'postgresql+psycopg2://test:test@192.168.21.79:5232/test',
    connect_args={'options': '-csearch_path={}'.format(dbschema)})

session = Session(engine)

def create_db_and_tables():
       SQLModel.metadata.create_all(engine)  

def SqlModelAggregation():
        statement = select(func.max(Ledger.depth))
        result = session.exec(statement).first()
        print("This is result >>", result)

        if result > 0:
            dele = Result.__table__.delete().where(Result.creator == "navid")
            engine.execute(dele)
         
            select_leafs = select(Ledger, Leaf).where(
                Ledger.ledger_code == Leaf.ledger_code)
            result_select_leafs = session.exec(select_leafs).all()
            for leaf in result_select_leafs:
                session.add(Result(depth=leaf[0].depth, ledger_code=leaf[0].ledger_code,
                            name=leaf[0].name, parent=leaf[0].parent, value=leaf[1].value, creator='navid'))
                session.commit()
              
            for i in range(result, 0, -1):
                print("This is   >>", i)
                statement_insert = (select( (func.max(Ledger.depth)-1).label("max_depth"), Ledger.parent, func.sum(
                    Result.value).label("sum_value") )
                    .join(Result, Ledger.ledger_code == Result.ledger_code)
                    .where(Ledger.depth == i, Result.creator == "navid")
                    .group_by(Ledger.parent)

                )
                print("this is query2 >>", statement_insert)

                result_insert = session.exec(statement_insert)
                print("I am here", result_insert)
                for row in result_insert:
                    print("This is result_insert >>", row.parent,
                          row.max_depth, row.sum_value)

                    session.add(Result(depth=row.max_depth, parent=row.parent,
                                value=row.sum_value, ledger_code=row.parent, creator='navid'))
                    session.commit()
                    session.close()

        return 1
    

def main():
    print("This is test 1 >>")
    create_db_and_tables()
    print("This is test 2 >>")
    SqlModelAggregation()  


if __name__ == "__main__":
    main()
navid sedigh
  • 279
  • 1
  • 5
  • 15

0 Answers0