| from langchain_community.tools.sql_database.tool import QuerySQLDataBaseTool |
| from langchain_community.utilities import SQLDatabase |
|
|
| from langflow.custom import CustomComponent |
| from langflow.field_typing import Text |
|
|
|
|
| class SQLExecutorComponent(CustomComponent): |
| display_name = "SQL Query" |
| description = "Execute SQL query." |
| name = "SQLExecutor" |
| beta: bool = True |
|
|
| def build_config(self): |
| return { |
| "database_url": { |
| "display_name": "Database URL", |
| "info": "The URL of the database.", |
| }, |
| "include_columns": { |
| "display_name": "Include Columns", |
| "info": "Include columns in the result.", |
| }, |
| "passthrough": { |
| "display_name": "Passthrough", |
| "info": "If an error occurs, return the query instead of raising an exception.", |
| }, |
| "add_error": { |
| "display_name": "Add Error", |
| "info": "Add the error to the result.", |
| }, |
| } |
|
|
| def clean_up_uri(self, uri: str) -> str: |
| if uri.startswith("postgresql://"): |
| uri = uri.replace("postgresql://", "postgres://") |
| return uri.strip() |
|
|
| def build( |
| self, |
| query: str, |
| database_url: str, |
| *, |
| include_columns: bool = False, |
| passthrough: bool = False, |
| add_error: bool = False, |
| **kwargs, |
| ) -> Text: |
| _ = kwargs |
| error = None |
| try: |
| database = SQLDatabase.from_uri(database_url) |
| except Exception as e: |
| msg = f"An error occurred while connecting to the database: {e}" |
| raise ValueError(msg) from e |
| try: |
| tool = QuerySQLDataBaseTool(db=database) |
| result = tool.run(query, include_columns=include_columns) |
| self.status = result |
| except Exception as e: |
| result = str(e) |
| self.status = result |
| if not passthrough: |
| raise |
| error = repr(e) |
|
|
| if add_error and error is not None: |
| result = f"{result}\n\nError: {error}\n\nQuery: {query}" |
| elif error is not None: |
| |
| |
| result = query |
|
|
| return result |
|
|