Jeremy Live
commited on
Commit
Β·
926fb90
1
Parent(s):
26e76ca
mv2
Browse files
app.py
CHANGED
@@ -355,6 +355,22 @@ def extract_sql_query(text):
|
|
355 |
|
356 |
return None
|
357 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
358 |
def execute_sql_query(query, db_connection):
|
359 |
"""Ejecuta una consulta SQL y devuelve los resultados como una cadena."""
|
360 |
if not db_connection:
|
@@ -364,7 +380,7 @@ def execute_sql_query(query, db_connection):
|
|
364 |
with db_connection._engine.connect() as connection:
|
365 |
# Ensure SQLAlchemy receives a SQL expression
|
366 |
if sa_text is not None and isinstance(query, str):
|
367 |
-
result = connection.execute(sa_text(query))
|
368 |
else:
|
369 |
result = connection.execute(query)
|
370 |
rows = result.fetchall()
|
@@ -545,7 +561,7 @@ async def stream_agent_response(question: str, chat_history: List[List[str]]) ->
|
|
545 |
logger.info(f"Detected SQL query: {sql_query}")
|
546 |
db_connection, _ = setup_database_connection()
|
547 |
if db_connection:
|
548 |
-
query_result = execute_sql_query(sql_query, db_connection)
|
549 |
|
550 |
# Add the query and its result to the response
|
551 |
response_text += f"\n\n### π Resultado de la consulta:\n```sql\n{sql_query}\n```\n\n{query_result}"
|
@@ -632,7 +648,7 @@ async def stream_agent_response(question: str, chat_history: List[List[str]]) ->
|
|
632 |
logger.info(f"Second pass SQL detected: {sql_query2}")
|
633 |
db_connection, _ = setup_database_connection()
|
634 |
if db_connection:
|
635 |
-
query_result = execute_sql_query(sql_query2, db_connection)
|
636 |
# Append query and result to response_text for transparency
|
637 |
response_text += f"\n\n### π Resultado de la consulta (2Βͺ pasada):\n```sql\n{sql_query2}\n```\n\n{query_result}"
|
638 |
# Try robust markdown table parse
|
|
|
355 |
|
356 |
return None
|
357 |
|
358 |
+
def sanitize_sql_query_text(query: str) -> str:
|
359 |
+
"""Normalize LLM-produced SQL text to be executable by MariaDB/MySQL.
|
360 |
+
|
361 |
+
- Converts literal escape sequences ("\\n", "\\t") to spaces
|
362 |
+
- Collapses excessive whitespace
|
363 |
+
- Strips surrounding code block backticks if any
|
364 |
+
"""
|
365 |
+
if not isinstance(query, str):
|
366 |
+
return query
|
367 |
+
q = query.strip().strip('`')
|
368 |
+
# Replace escaped newlines/tabs that sometimes appear in model outputs
|
369 |
+
q = q.replace("\\n", " ").replace("\\t", " ")
|
370 |
+
# Collapse whitespace to single spaces
|
371 |
+
q = re.sub(r"\s+", " ", q)
|
372 |
+
return q
|
373 |
+
|
374 |
def execute_sql_query(query, db_connection):
|
375 |
"""Ejecuta una consulta SQL y devuelve los resultados como una cadena."""
|
376 |
if not db_connection:
|
|
|
380 |
with db_connection._engine.connect() as connection:
|
381 |
# Ensure SQLAlchemy receives a SQL expression
|
382 |
if sa_text is not None and isinstance(query, str):
|
383 |
+
result = connection.execute(sa_text(sanitize_sql_query_text(query)))
|
384 |
else:
|
385 |
result = connection.execute(query)
|
386 |
rows = result.fetchall()
|
|
|
561 |
logger.info(f"Detected SQL query: {sql_query}")
|
562 |
db_connection, _ = setup_database_connection()
|
563 |
if db_connection:
|
564 |
+
query_result = execute_sql_query(sanitize_sql_query_text(sql_query), db_connection)
|
565 |
|
566 |
# Add the query and its result to the response
|
567 |
response_text += f"\n\n### π Resultado de la consulta:\n```sql\n{sql_query}\n```\n\n{query_result}"
|
|
|
648 |
logger.info(f"Second pass SQL detected: {sql_query2}")
|
649 |
db_connection, _ = setup_database_connection()
|
650 |
if db_connection:
|
651 |
+
query_result = execute_sql_query(sanitize_sql_query_text(sql_query2), db_connection)
|
652 |
# Append query and result to response_text for transparency
|
653 |
response_text += f"\n\n### π Resultado de la consulta (2Βͺ pasada):\n```sql\n{sql_query2}\n```\n\n{query_result}"
|
654 |
# Try robust markdown table parse
|