ВВЕДЕНИЕ < /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]
ВВЕДЕНИЕ < /h2> Я в настоящее время строю помощника ИИ, у которого есть агент SQL, где ее идея просто генерирует SQL Queries на основе вопроса пользователя. Использование Python и его библиотеки. Проблема заключалась в начале заключалась в том, что в базе данных выше 150 таблиц, где каждая имена таблицы/столбцов не ясно, что FOT SQL LLM, так как в ней есть некоторые арабские слова, написанные на английском языке, французские слова также написаны на английском языке, имена, такие как компания, а не в компании, или некоторые типосы. < /h2> [list] [*] Фаза внедрения
Создание файла 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 [/list]
[b] Основная задача [/b] Реализация Remapper, которая должна вернуть имена таблицы/столбцов на исходные значения ответа запроса агента SQL. Функция Remap должна обрабатывать любые сгенерированные код SQL простыми или сложными. /> output Вывод должен быть запросом, в котором есть имена таблиц/столбцов, возвращенные к исходным Я реализовал все, кроме переоборудования, поскольку агент SQL мог бы генерировать сложные запросы, или он не мог использовать псевдоним или ни одного способа писать запросы. /> функция Remap < /h2> [code] 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'(?
Я использую Codeigniter для доступа к базе данных, но у меня есть проблема безопасности.
$q = $this->db->query( SELECT * FROM mytable WHERE id = '$p' );
return $q->result();
Когда я загружаю массив результатов в мою точку зрения, я json-ecode в...
Я использую Codeigniter для доступа к базе данных, но у меня есть проблема безопасности.
$q = $this->db->query( SELECT * FROM mytable WHERE id = '$p' );
return $q->result();
Когда я загружаю массив результатов в мою точку зрения, я json-ecode в...
Я хотел бы извлечь имена столбцов полученной таблицы непосредственно из оператора SQL:
query =
select
sales.order_id as id,
p.product_name,
sum(p.price) as sales_volume
from sales
right join products as p
on sales.product_id=p.product_id
group...