Передача ответа запроса агента SQL на исходные имена таблицы/столбцов/столбцовPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Передача ответа запроса агента SQL на исходные имена таблицы/столбцов/столбцов

Сообщение Anonymous »

ВВЕДЕНИЕ < /h2>
Я в настоящее время строю помощника ИИ, у которого есть агент SQL, где ее идея просто генерирует SQL Queries на основе вопроса пользователя. Использование Python и его библиотеки.
Проблема заключалась в начале заключалась в том, что в базе данных выше 150 таблиц, где каждая имена таблицы/столбцов не ясно, что FOT SQL LLM, так как в ней есть некоторые арабские слова, написанные на английском языке, французские слова также написаны на английском языке, имена, такие как компания, а не в компании, или некоторые типосы. < /h2>
  • Фаза внедрения

    Создание файла JSON, который содержит сопоставление старых имен с лучшими, более четкими. < /li>
    Заменили жесткие слова, чтобы облегчить, что схема, схема, является более простым, используется по -другому: схема, используя другие: Таблица /столбец < /li>
    Создание победителей с использованием Embedder для упрощения поиска < /li>
    < /ol>
    < /li>
    Фаза повторного поиска

    Rag используется в описании таблицы, с ключевым словом поиск. another is used to choose the columns related, based also on descriptions
  • after the selection, the related tables is passed to the sql agent which will generate the sql query
  • after the sql generation the table names should return to the original names, also for the column names

Основная задача
Реализация Remapper, которая должна вернуть имена таблицы/столбцов на исходные значения ответа запроса агента SQL. Функция Remap должна обрабатывать любые сгенерированные код SQL простыми или сложными. /> output
Вывод должен быть запросом, в котором есть имена таблиц/столбцов, возвращенные к исходным
Я реализовал все, кроме переоборудования, поскольку агент SQL мог бы генерировать сложные запросы, или он не мог использовать псевдоним или ни одного способа писать запросы. /> функция Remap < /h2>

Код: Выделить всё

 def remap_sql_using_selected_tables(self, sql_query: str, selected_tables: dict) -> str:
"""
Remap friendly table/column names to original database names using selected tables.
Handles aliases, qualified columns, unqualified columns (if unambiguous), and CTEs.

Args:
sql_query (str): SQL using friendly names.
selected_tables (dict): Selected tables from previous steps.

Returns:
str: SQL with friendly names replaced by original names.
"""
#return it to the form that is accepted within the function, as it accepts columns in list form without any information
for tbl in selected_tables.keys():
list_of_columns = list(selected_tables[tbl]['table_columns'].keys())
selected_tables[tbl]['table_columns'] = list_of_columns

#Build reverse mapping only for selected tables
reverse_mapping = {
tbl: mapping for tbl, mapping in self.original_table_column_mapping.items()
if tbl in selected_tables
}

#Normalize SQL and aliases (remove quotes for consistency)
sql_query_clean = sql_query.replace('"', '').replace('`', '')

#Detect aliases in FROM, JOIN, and CTEs
alias_pattern = re.compile(r'\b(FROM|JOIN)\s+([^\s,()]+)(?:\s+(?:AS\s+)?(\w+))?', re.IGNORECASE)
aliases = {}  # alias ->  friendly table
for match in alias_pattern.finditer(sql_query_clean):
_, table_or_subquery, alias = match.groups()
table_clean = table_or_subquery.strip()
if alias:
aliases[alias.strip()] = table_clean
else:
aliases[table_clean] = table_clean

#Detect CTEs
cte_pattern = re.compile(r'\bWITH\s+(\w+)\s+AS\s*\(', re.IGNORECASE)
for match in cte_pattern.finditer(sql_query_clean):
cte_name = match.group(1)
aliases[cte_name] = cte_name

#Replace table names first (FROM, JOIN)
for friendly_table, mapping in reverse_mapping.items():
sql_query_clean = re.sub(rf'\b{re.escape(friendly_table)}\b',
mapping["original"],
sql_query_clean,
flags=re.IGNORECASE)

# Replace qualified columns (alias.column or table.column)
for alias, friendly_table in aliases.items():
if friendly_table not in reverse_mapping:
continue
col_map = reverse_mapping[friendly_table]["columns"]
for friendly_col, orig_col in col_map.items():
# Replace alias.column
sql_query_clean = re.sub(rf'\b{re.escape(alias)}\.{re.escape(friendly_col)}\b',
f'{alias}.{orig_col}',
sql_query_clean,
flags=re.IGNORECASE)
# Replace table.column
sql_query_clean = re.sub(rf'\b{re.escape(reverse_mapping[friendly_table]["original"])}\.{re.escape(friendly_col)}\b',
f'{reverse_mapping[friendly_table]["original"]}.{orig_col}',
sql_query_clean,
flags=re.IGNORECASE)

#Replace unqualified columns if unambiguous
all_columns = {}
for table, mapping in reverse_mapping.items():
for friendly_col, orig_col in mapping["columns"].items():
all_columns.setdefault(friendly_col, set()).add(orig_col)

for friendly_col, orig_set in all_columns.items():
if len(orig_set) == 1:
sql_query_clean = re.sub(rf'(?

Подробнее здесь: [url]https://stackoverflow.com/questions/79759059/remapping-sql-agents-query-response-to-the-original-table-column-names[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»