|
|
import os |
|
|
from sqlalchemy.sql import text |
|
|
from sqlalchemy import create_engine |
|
|
from sqlalchemy.orm import sessionmaker |
|
|
|
|
|
from semantic_kernel import Kernel |
|
|
from semantic_kernel.orchestration.sk_context import SKContext |
|
|
from semantic_kernel.skill_definition import sk_function, sk_function_context_parameter |
|
|
|
|
|
|
|
|
from dotenv import load_dotenv |
|
|
load_dotenv() |
|
|
|
|
|
class SQLGetQuery: |
|
|
def __init__(self, kernel: Kernel): |
|
|
self._kernel = kernel |
|
|
|
|
|
@sk_function( |
|
|
description="Query SQL database related to user question", |
|
|
name="dbQuery", |
|
|
) |
|
|
@sk_function_context_parameter(name="input", description="SQL query related to user question which was generated by LLM") |
|
|
def db_query(self, context: SKContext) -> str: |
|
|
|
|
|
username = os.environ['USERNAME'] |
|
|
password = os.environ['PASSWORD'] |
|
|
driver = os.environ['DRIVER'] |
|
|
|
|
|
server = os.environ['CONNECTION_STRING'] |
|
|
database = os.environ['DB'] |
|
|
query = text(context['input']) |
|
|
print(f"\n------------------\nSQL QUERY:\n {query}\n------------------\n") |
|
|
connection_string = f'mssql+pyodbc://{username}:{password}@{server}/{database}?driver={driver}&TrustServerCertificate=no&Authentication=ActiveDirectoryPassword' |
|
|
|
|
|
engine = create_engine(connection_string, echo=False, connect_args={'auto_commit': True}, fast_executemany=True) |
|
|
Session = sessionmaker(bind=engine) |
|
|
session = Session() |
|
|
|
|
|
results = session.execute(query).fetchall() |
|
|
results = str(results).strip() |
|
|
|
|
|
context['queryresult'] = results |
|
|
context['db_string'] = server |
|
|
context['db_name'] = database |
|
|
context['sql_query'] = str(query) |
|
|
print(f"\n------------------\nSQL RESULT:\n {results}\n------------------\n") |
|
|
|
|
|
return results |