<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Manuel Andree dongo Palza</title>
    <description>The latest articles on DEV Community by Manuel Andree dongo Palza (@manuel_dong00).</description>
    <link>https://dev.to/manuel_dong00</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4018051%2F21556e6c-d826-4ade-9843-9d34cdd5ce4f.jpg</url>
      <title>DEV Community: Manuel Andree dongo Palza</title>
      <link>https://dev.to/manuel_dong00</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/manuel_dong00"/>
    <language>en</language>
    <item>
      <title>[Boost]</title>
      <dc:creator>Manuel Andree dongo Palza</dc:creator>
      <pubDate>Mon, 06 Jul 2026 15:44:39 +0000</pubDate>
      <link>https://dev.to/manuel_dong00/-540n</link>
      <guid>https://dev.to/manuel_dong00/-540n</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/manuel_dong00/como-hablar-con-tu-base-de-datos-usando-ia-y-construir-un-extractor-sql-seguro-con-streamlit-3hi3" class="crayons-story__hidden-navigation-link"&gt;Cómo hablar con tu base de datos usando IA y construir un extractor SQL seguro con Streamlit&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/manuel_dong00" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4018051%2F21556e6c-d826-4ade-9843-9d34cdd5ce4f.jpg" alt="manuel_dong00 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/manuel_dong00" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Manuel Andree dongo Palza
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Manuel Andree dongo Palza
                
              
              &lt;div id="story-author-preview-content-4081100" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/manuel_dong00" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4018051%2F21556e6c-d826-4ade-9843-9d34cdd5ce4f.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Manuel Andree dongo Palza&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/manuel_dong00/como-hablar-con-tu-base-de-datos-usando-ia-y-construir-un-extractor-sql-seguro-con-streamlit-3hi3" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 6&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/manuel_dong00/como-hablar-con-tu-base-de-datos-usando-ia-y-construir-un-extractor-sql-seguro-con-streamlit-3hi3" id="article-link-4081100"&gt;
          Cómo hablar con tu base de datos usando IA y construir un extractor SQL seguro con Streamlit
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/python"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;python&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/security"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;security&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/sql"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;sql&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/manuel_dong00/como-hablar-con-tu-base-de-datos-usando-ia-y-construir-un-extractor-sql-seguro-con-streamlit-3hi3#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              1&lt;span class="hidden s:inline"&gt;&amp;nbsp;comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            6 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Cómo hablar con tu base de datos usando IA y construir un extractor SQL seguro con Streamlit</title>
      <dc:creator>Manuel Andree dongo Palza</dc:creator>
      <pubDate>Mon, 06 Jul 2026 15:44:03 +0000</pubDate>
      <link>https://dev.to/manuel_dong00/como-hablar-con-tu-base-de-datos-usando-ia-y-construir-un-extractor-sql-seguro-con-streamlit-3hi3</link>
      <guid>https://dev.to/manuel_dong00/como-hablar-con-tu-base-de-datos-usando-ia-y-construir-un-extractor-sql-seguro-con-streamlit-3hi3</guid>
      <description>&lt;p&gt;Abstract&lt;/p&gt;

&lt;p&gt;Cada vez más equipos quieren consultar datos sin escribir SQL a mano. El problema es que un sistema Text-to-SQL no solo debe “traducir preguntas”, sino también entender el esquema, restringir permisos, validar consultas y explicar por qué una consulta es rápida o lenta. Ese enfoque coincide con la ruta propuesta por el tutorial oficial de LangChain para agentes SQL: listar tablas, inspeccionar esquemas, generar la consulta, revisarla, ejecutarla y corregir errores hasta obtener una respuesta; y el propio tutorial advierte que ejecutar SQL generado por modelos tiene riesgos y exige permisos mínimos. En paralelo, la documentación oficial de Python recomienda usar placeholders en sqlite3 para enlazar parámetros y evitar inyección SQL, mientras que la documentación de SQLite explica que EXPLAIN QUERY PLAN permite inspeccionar si una consulta hace SCAN, SEARCH y si usa índices. &lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/manueldongo23" rel="noopener noreferrer"&gt;
        manueldongo23
      &lt;/a&gt; / &lt;a href="https://github.com/manueldongo23/sql_ai_sales_assistant_demo" rel="noopener noreferrer"&gt;
        sql_ai_sales_assistant_demo
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;SQL AI Sales Assistant&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A safe &lt;strong&gt;Text-to-SQL&lt;/strong&gt; demo that converts natural language business questions into SQL queries, executes them on a local SQLite retail database, and shows the generated SQL plus &lt;code&gt;EXPLAIN QUERY PLAN&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This project was created as evidence for an article about &lt;strong&gt;SQL AI Database Solutions&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Topic&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Talk to your database with AI: build a safe SQL query extractor with Streamlit and SQLite.&lt;/strong&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Natural language prompts such as &lt;code&gt;sales by month&lt;/code&gt;, &lt;code&gt;top customers&lt;/code&gt;, &lt;code&gt;sales in Lima&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Rule-assisted NL→SQL generation, designed to be transparent and auditable.&lt;/li&gt;
&lt;li&gt;SQLite demo database with customers, products, orders and order items.&lt;/li&gt;
&lt;li&gt;Read-only SQL validator that blocks destructive commands.&lt;/li&gt;
&lt;li&gt;Parameterized queries for user-provided filters.&lt;/li&gt;
&lt;li&gt;Streamlit interface.&lt;/li&gt;
&lt;li&gt;CLI demo for quick testing.&lt;/li&gt;
&lt;li&gt;Query plan inspection with &lt;code&gt;EXPLAIN QUERY PLAN&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Architecture&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;User question
   ↓
NL → SQL interpreter
   ↓
Read-only SQL validator
   ↓
SQLite execution
   ↓
Results + EXPLAIN QUERY&lt;/code&gt;&lt;/pre&gt;…&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/manueldongo23/sql_ai_sales_assistant_demo" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;
Cuerpo del artículo

&lt;p&gt;La promesa de SQL + IA suena sencilla: le haces una pregunta al sistema y este devuelve una tabla, un indicador o una respuesta de negocio. Pero en la práctica, los sistemas serios no viven solo de “adivinar SQL”. Los benchmarks más influyentes lo dejan claro. Spider fue diseñado precisamente para medir si un modelo puede generalizar a bases de datos no vistas, y los resultados iniciales mostraron que el problema seguía siendo difícil incluso para consultas complejas. CoSQL, por su parte, añadió turnos conversacionales, aclaraciones y reformulaciones, algo mucho más parecido a lo que pasa en equipos reales cuando un analista pregunta, corrige y vuelve a preguntar. &lt;/p&gt;

&lt;p&gt;Por eso, en vez de hacer un demo “mágico” y opaco, este proyecto usa una arquitectura híbrida y segura. El flujo es: el usuario escribe una pregunta en lenguaje natural, una capa de interpretación identifica la intención, se genera SQL, un validador bloquea sentencias peligrosas, SQLite ejecuta solo lecturas y la interfaz muestra tanto el resultado como el plan de ejecución. Esta decisión no es casual: LangChain documenta exactamente esa secuencia conceptual para un agente SQL y subraya que las credenciales del motor deben estar limitadas al mínimo necesario. &lt;/p&gt;

&lt;p&gt;El caso de uso que elegí fue analítica de ventas retail, porque permite mostrar ejemplos de negocio que cualquiera entiende y, al mismo tiempo, obliga a tocar varios patrones SQL reales: agregaciones, JOIN, GROUP BY, filtros por ciudad, filtros temporales, rankings y cálculo de ticket promedio. También funciona muy bien con SQLite, que la documentación oficial de Python describe como una biblioteca ligera, basada en disco y sin proceso servidor separado, ideal para prototipos y aplicaciones pequeñas antes de migrar a motores mayores. &lt;/p&gt;

&lt;p&gt;La base de datos del demo tiene cuatro tablas: customers, products, orders y order_items. Con ese esquema, ya puedes responder preguntas como estas:&lt;/p&gt;

&lt;p&gt;¿Cuáles fueron las ventas por mes?&lt;br&gt;
¿Quiénes son mis mejores clientes?&lt;br&gt;
¿Qué productos son los más vendidos?&lt;br&gt;
¿Qué artículos tienen stock bajo?&lt;br&gt;
¿Cuánto vendí en Lima?&lt;br&gt;
¿Cuál es el ticket promedio?&lt;br&gt;
¿Cuánto se vendió en una categoría concreta?&lt;br&gt;
¿Cuánto se vendió entre dos fechas?&lt;br&gt;
Un ejemplo clásico es “Muéstrame las ventas por mes”. En ese caso, la capa NL2SQL detecta una intención temporal y genera esta consulta:&lt;/p&gt;

&lt;p&gt;sql&lt;br&gt;
Copiar&lt;br&gt;
SELECT substr(o.order_date, 1, 7) AS month,&lt;br&gt;
       ROUND(SUM(oi.quantity * oi.unit_price), 2) AS revenue,&lt;br&gt;
       COUNT(DISTINCT o.order_id) AS total_orders&lt;br&gt;
FROM orders o&lt;br&gt;
JOIN order_items oi ON oi.order_id = o.order_id&lt;br&gt;
GROUP BY substr(o.order_date, 1, 7)&lt;br&gt;
ORDER BY month;&lt;br&gt;
Ese ejemplo es importante porque muestra dos cosas. Primero, la IA no responde “en abstracto”, sino que aterriza en un SQL ejecutable. Segundo, el sistema puede explicar rendimiento. La documentación oficial de SQLite indica que EXPLAIN QUERY PLAN muestra si el motor realiza un SCAN completo o un SEARCH usando índices, y esa diferencia sirve para enseñar optimización de consultas con un caso real. &lt;/p&gt;

&lt;p&gt;Otro ejemplo muy útil para negocio es el ranking de mejores clientes. Ahí usamos JOIN entre clientes, pedidos y detalle de pedido para sumar ingresos y contar órdenes. Esa es la consulta:&lt;/p&gt;

&lt;p&gt;sql&lt;br&gt;
Copiar&lt;br&gt;
SELECT c.full_name,&lt;br&gt;
       c.city,&lt;br&gt;
       ROUND(SUM(oi.quantity * oi.unit_price), 2) AS total_sales,&lt;br&gt;
       COUNT(DISTINCT o.order_id) AS total_orders&lt;br&gt;
FROM customers c&lt;br&gt;
JOIN orders o ON o.customer_id = c.customer_id&lt;br&gt;
JOIN order_items oi ON oi.order_id = o.order_id&lt;br&gt;
GROUP BY c.customer_id, c.full_name, c.city&lt;br&gt;
ORDER BY total_sales DESC&lt;br&gt;
LIMIT 5;&lt;br&gt;
Este tipo de ejemplo es “real” porque responde una pregunta clásica de gerencia comercial: quién compra más, desde qué ciudad y con cuántos pedidos. En otras palabras, el sistema no es un juguete para seleccionar una sola tabla; trabaja con relaciones, agregaciones y límites, que son exactamente los componentes que un sistema Text-to-SQL serio debe manejar. Los trabajos sobre KaggleDBQA y sobre evaluación de ChatGPT en Text-to-SQL justamente remarcan que el salto desde datasets controlados a bases más reales sigue siendo un desafío, sobre todo cuando cambia el dominio, el formato y la forma en que los usuarios formulan sus preguntas. &lt;/p&gt;

&lt;p&gt;La parte más importante del proyecto no está en la interfaz, sino en la seguridad. Si alguien te vende un “chat con tu base de datos” sin hablar de permisos, validación o inyección SQL, te está mostrando solo la mitad del sistema. La documentación de sqlite3 en Python recomienda expresamente usar placeholders como ? en vez de interpolar cadenas, para evitar ataques de inyección SQL. Mi demo sigue esa recomendación para filtros por ciudad, categoría o intervalos de fechas. Además, el motor bloquea cualquier consulta que no empiece por SELECT o WITH, y rechaza instrucciones como DROP, DELETE, UPDATE, ALTER, PRAGMA o múltiples sentencias encadenadas. &lt;/p&gt;

&lt;p&gt;Aquí tienes el núcleo de esa validación:&lt;/p&gt;

&lt;p&gt;python&lt;br&gt;
Copiar&lt;br&gt;
FORBIDDEN_SQL = {&lt;br&gt;
    "insert", "update", "delete", "drop", "alter", "attach", "detach",&lt;br&gt;
    "replace", "truncate", "create", "pragma", "vacuum", "reindex"&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;def validate_sql(sql: str) -&amp;gt; None:&lt;br&gt;
    normalized = re.sub(r"\s+", " ", sql.strip().lower())&lt;br&gt;
    if not (normalized.startswith("select") or normalized.startswith("with")):&lt;br&gt;
        raise ValueError("Solo se permiten consultas SELECT o WITH.")&lt;br&gt;
    for keyword in FORBIDDEN_SQL:&lt;br&gt;
        if re.search(rf"\b{re.escape(keyword)}\b", normalized):&lt;br&gt;
            raise ValueError(f"Consulta bloqueada por seguridad: contiene '{keyword}'.")&lt;br&gt;
La interfaz la construí con Streamlit porque su guía oficial de inicio rápido está pensada precisamente para levantar una app de datos con muy poca fricción, instalando el entorno y creando una primera aplicación de forma directa. Para un demo académico, eso es ideal porque te deja concentrarte en el flujo NL2SQL y no en el frontend complejo. &lt;/p&gt;

&lt;p&gt;La capa de interpretación también está diseñada para ser útil en clase o en una publicación técnica. En vez de esconder todo detrás de un LLM remoto, el sistema expone qué regla identificó, qué SQL generó, qué parámetros usó y qué plan de ejecución devolvió SQLite. Eso vuelve el comportamiento del demo auditado y explicable, que es justo lo que falta en muchos ejemplos de “IA para bases de datos”.&lt;/p&gt;

&lt;p&gt;Este enfoque además se alinea con proyectos públicos del ecosistema. DB-GPT-Hub se presenta como un repositorio orientado a Text-to-SQL parsing with LLMs, con código, documentación, requisitos y experimentos para mejorar desempeño de modelos en Text-to-SQL. Vanna, por su parte, define su propuesta como “Natural language → SQL → Answers” y la documentación de Vanna 2.0 describe un framework de agente que conecta LLMs con bases de datos, aprendiendo de interacciones exitosas y aplicando controles de acceso. Para fines de artículo, eso permite mostrar que tu demo no sale de la nada: está alineado con líneas públicas y reconocibles del ecosistema. &lt;/p&gt;

&lt;p&gt;La gran lección es esta: el verdadero valor de SQL + IA no está en reemplazar SQL, sino en encapsularlo de forma segura, comprensible y útil para el negocio. Un buen sistema Text-to-SQL no debe ser solo generativo; debe ser verificable. Si puede mostrar el SQL, justificar la consulta, enlazar parámetros, restringir permisos y enseñar el plan de ejecución, entonces deja de ser una demo vistosa y se convierte en una solución de ingeniería que sí puede escalar. Esa misma tensión entre potencia y fiabilidad es visible en la bibliografía reciente: los trabajos más sólidos siguen invirtiendo en schema linking, recuperación de ejemplos, validación y evaluación fuera de distribución, no solo en “usar un modelo más grande”. &lt;/p&gt;

&lt;p&gt;Conclusión&lt;/p&gt;

&lt;p&gt;Si quieres construir una solución de bases de datos con IA que de verdad sirva, empieza por un dominio concreto, un esquema pequeño pero real, una capa de validación estricta y una interfaz clara. Después de eso, puedes sustituir el motor híbrido por un LLM o por un framework especializado. Pero la base correcta sigue siendo la misma: esquema, seguridad, SQL verificable y observabilidad. &lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/manueldongo23" rel="noopener noreferrer"&gt;
        manueldongo23
      &lt;/a&gt; / &lt;a href="https://github.com/manueldongo23/sql_ai_sales_assistant_demo" rel="noopener noreferrer"&gt;
        sql_ai_sales_assistant_demo
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;SQL AI Sales Assistant&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A safe &lt;strong&gt;Text-to-SQL&lt;/strong&gt; demo that converts natural language business questions into SQL queries, executes them on a local SQLite retail database, and shows the generated SQL plus &lt;code&gt;EXPLAIN QUERY PLAN&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This project was created as evidence for an article about &lt;strong&gt;SQL AI Database Solutions&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Topic&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Talk to your database with AI: build a safe SQL query extractor with Streamlit and SQLite.&lt;/strong&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Natural language prompts such as &lt;code&gt;sales by month&lt;/code&gt;, &lt;code&gt;top customers&lt;/code&gt;, &lt;code&gt;sales in Lima&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Rule-assisted NL→SQL generation, designed to be transparent and auditable.&lt;/li&gt;
&lt;li&gt;SQLite demo database with customers, products, orders and order items.&lt;/li&gt;
&lt;li&gt;Read-only SQL validator that blocks destructive commands.&lt;/li&gt;
&lt;li&gt;Parameterized queries for user-provided filters.&lt;/li&gt;
&lt;li&gt;Streamlit interface.&lt;/li&gt;
&lt;li&gt;CLI demo for quick testing.&lt;/li&gt;
&lt;li&gt;Query plan inspection with &lt;code&gt;EXPLAIN QUERY PLAN&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Architecture&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;User question
   ↓
NL → SQL interpreter
   ↓
Read-only SQL validator
   ↓
SQLite execution
   ↓
Results + EXPLAIN QUERY&lt;/code&gt;&lt;/pre&gt;…&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/manueldongo23/sql_ai_sales_assistant_demo" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>ai</category>
      <category>python</category>
      <category>security</category>
      <category>sql</category>
    </item>
  </channel>
</rss>
