Skip to content

1.1版本-新增where条件表达式值判断 #3

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 81 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
d0cb008
Add files via upload
hcymysql Sep 5, 2023
a94fe76
Update README.md
hcymysql Sep 5, 2023
640120c
Create where_clause.py
hcymysql Sep 5, 2023
ec3b971
Delete src/where_column.py
hcymysql Sep 5, 2023
ceb2b08
Add files via upload
hcymysql Sep 5, 2023
379b82d
Delete src/sql_gpt.py
hcymysql Sep 5, 2023
ebddd58
Add files via upload
hcymysql Sep 5, 2023
6cfe170
Add files via upload
hcymysql Sep 5, 2023
d2e5861
Update README.md
hcymysql Sep 5, 2023
ff44eda
Add files via upload
hcymysql Sep 5, 2023
4f1f77e
Add files via upload
hcymysql Sep 5, 2023
5492e90
Add files via upload
hcymysql Sep 6, 2023
bdee761
Add files via upload
hcymysql Sep 6, 2023
cf6dc28
Update README.md
hcymysql Sep 6, 2023
8223bce
Add files via upload
hcymysql Sep 6, 2023
e48a2d0
Update sql_format_class.py
hcymysql Sep 6, 2023
e1b08d4
Update README.md
hcymysql Sep 6, 2023
259934f
Add files via upload
hcymysql Sep 6, 2023
8276c4b
Add files via upload
hcymysql Sep 6, 2023
d050620
Add files via upload
hcymysql Sep 6, 2023
3f95a82
Add files via upload
hcymysql Sep 6, 2023
ab273ea
Update README.md
hcymysql Sep 6, 2023
0268755
Update README.md
hcymysql Sep 7, 2023
6cb7360
Add files via upload
hcymysql Sep 12, 2023
176b5d7
Add files via upload
hcymysql Sep 12, 2023
f5c1d02
Add files via upload
hcymysql Sep 12, 2023
018af86
Add files via upload
hcymysql Sep 12, 2023
00edc6f
Add files via upload
hcymysql Sep 12, 2023
c6a2b86
Update README.md
hcymysql Sep 12, 2023
997bb11
Add files via upload
hcymysql Sep 14, 2023
c66a7d0
Add files via upload
hcymysql Sep 14, 2023
0f3d5f0
Update sql_helper_schema.sql
hcymysql Nov 11, 2023
890bff0
Delete web/sql_helper/sql_helper.py
hcymysql Nov 11, 2023
9776517
Delete web/sql_helper/sql_helper_args.py
hcymysql Nov 11, 2023
acbc8eb
Add files via upload
hcymysql Nov 11, 2023
3f8e132
sql_helper工具版本号: 1.1.5,更新日期:2023-11-27
hcymysql Nov 27, 2023
dc99c05
Add files via upload
hcymysql Nov 27, 2023
432d485
sql_helper工具版本号: 1.1.5,更新日期:2023-11-27
hcymysql Nov 27, 2023
4c8f464
Update README.md
hcymysql Dec 1, 2023
7d918e4
Update README.md
hcymysql Jan 31, 2024
1d966a7
Update README.md
hcymysql Jan 31, 2024
45ec292
Update README.md
hcymysql Jul 2, 2024
6090d20
Update README.md
hcymysql Jul 3, 2024
dfa584a
Delete sql_helper_args
hcymysql Oct 10, 2024
04fa369
Delete sql_helper
hcymysql Oct 10, 2024
4425f2b
Delete web/sql_helper/sql_helper_args
hcymysql Oct 10, 2024
0a0bedf
Update sql_helper_result.php
hcymysql Oct 10, 2024
9245598
Update test.yaml
hcymysql Oct 10, 2024
a05f4aa
Add files via upload
hcymysql Oct 10, 2024
fe157e4
Update sqlai.py
hcymysql Oct 10, 2024
379eaef
Update README.md
hcymysql Oct 10, 2024
b479a91
Add files via upload
hcymysql Oct 10, 2024
7d51bc6
Update README.md
hcymysql Oct 10, 2024
af2fe98
Update README.md
hcymysql Nov 4, 2024
1e2307f
Update sqlai.py
hcymysql Feb 17, 2025
c3ae3b7
Delete src/sql_helper_args.py
hcymysql Feb 17, 2025
a3e2074
Delete src/sql_helper.py
hcymysql Feb 17, 2025
470431f
Create requirements.txt
hcymysql Feb 20, 2025
46c9b48
Add files via upload
hcymysql Feb 20, 2025
a84876f
Create index.html
hcymysql Feb 20, 2025
fab9f1f
Update README.md
hcymysql Feb 20, 2025
5784878
Add files via upload
hcymysql Feb 20, 2025
24e55c5
Update README.md
hcymysql Feb 20, 2025
575db85
Update README.md
hcymysql Feb 20, 2025
59b149f
Create requirements.txt
hcymysql Feb 26, 2025
2209029
Add files via upload
hcymysql Feb 26, 2025
5fb5fcb
Create index.html
hcymysql Feb 26, 2025
3a466c7
Update sql_deepseek.py
hcymysql Feb 26, 2025
c075d3a
Delete deepseek_flash_src/sql_deepseek.py
hcymysql Feb 26, 2025
2b65c47
Add files via upload
hcymysql Feb 26, 2025
d56abe1
Update sql_deepseek.py
hcymysql Feb 26, 2025
87ebb57
Add files via upload
hcymysql Feb 26, 2025
7c9b2ea
Update README.md
hcymysql Feb 26, 2025
7d6b909
Update README.md
hcymysql Feb 27, 2025
08d5755
Update README.md
hcymysql Feb 27, 2025
319c5dc
Add files via upload
hcymysql Mar 4, 2025
ecba591
Add files via upload
hcymysql Mar 5, 2025
dc3a70e
Update README.md
hcymysql Mar 5, 2025
0581d80
修正错误信息被遮挡或未正确显示
hcymysql Mar 6, 2025
2df974d
Update README.md
hcymysql Mar 11, 2025
e57bfc9
增加进度条
hcymysql Mar 12, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
470 changes: 470 additions & 0 deletions Flask_src/app.py

Large diffs are not rendered by default.

8 changes: 8 additions & 0 deletions Flask_src/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
Flask
PyMySQL
sql-metadata
tabulate
rich
PyYAML
vanna==0.0.36
sqlparse
11 changes: 11 additions & 0 deletions Flask_src/sql_alias.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
def has_table_alias(table_alias):
if isinstance(table_alias, dict):
table_alias = {k.lower(): v.lower() for k, v in table_alias.items()}
if 'join' in table_alias or 'on' in table_alias or 'where' in table_alias or 'group by' in table_alias or 'order by' in table_alias or 'limit' in table_alias or not table_alias:
return False # 没有别名
else:
return True #有别名
elif isinstance(table_alias, list):
return False # 没有别名
else:
pass
115 changes: 115 additions & 0 deletions Flask_src/sql_count_value.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
import pymysql
from rich.progress import Progress, TimeElapsedColumn, TextColumn, BarColumn

def count_column_value(table_name, field_name, mysql_settings, sample_size):
with pymysql.connect(**mysql_settings) as conn:
with conn.cursor() as cursor:
"""
在这个查询中,使用了CASE语句来判断数据行数是否小于100000。如果数据行数小于100000,则使用
(SELECT COUNT(*) FROM {table_name}) / 2
作为阈值,即表的实际大小除以2;否则使用 {sample_size} / 2 作为阈值。
"""

# 如果你的数据库是MySQL 8.0,那么推荐用 CTE(公共表达式)的形式
'''
sql = f"""
WITH subquery AS (
SELECT {field_name}
FROM {table_name}
LIMIT {sample_size}
)
SELECT COUNT(*) as count
FROM subquery
GROUP BY {field_name}
HAVING COUNT(*) >=
CASE
WHEN (SELECT COUNT(*) FROM subquery) < {sample_size} THEN (SELECT COUNT(*) FROM {table_name}) / 2
ELSE {sample_size} / 2
END;
"""
'''

# 默认采用子查询兼容MySQL 5.7版本
sql = f"""
SELECT COUNT(*) as count
FROM (
SELECT {field_name}
FROM {table_name}
LIMIT {sample_size}
) AS subquery
GROUP BY {field_name}
HAVING COUNT(*) >= CASE WHEN (SELECT COUNT(*) FROM {table_name} LIMIT {sample_size}) < {sample_size}
THEN (SELECT COUNT(*) FROM {table_name}) / 2 ELSE {sample_size} / 2 END;
"""

# print(sql)
with Progress(TextColumn("[progress.description]{task.description}", justify="right"), BarColumn(), TextColumn("[progress.percentage]{task.percentage:>3.0f}%"), TimeElapsedColumn()) as progress:
task = progress.add_task(f"[cyan]Executing SQL query [bold magenta]{table_name}[/bold magenta] [cyan]where_clause [bold magenta]{field_name}[/bold magenta]...", total=1)
cursor.execute(sql)
progress.update(task, completed=1)

results = cursor.fetchall()

if results:
# 如果有超过半数的重复数据
return results
else:
return False


def count_column_clause_value(table_name, field_name, where_clause_value, mysql_settings, sample_size):
with pymysql.connect(**mysql_settings) as conn:
with conn.cursor() as cursor:

"""
在这个查询中,使用了CASE语句来判断数据行数是否小于100000。如果数据行数小于100000,则使用
(SELECT COUNT(*) FROM {table_name}) / 2
作为阈值,即表的实际大小除以2;否则使用 {sample_size} / 2 作为阈值。
"""

# 如果你的数据库是MySQL 8.0,那么推荐用 CTE(公共表达式)的形式
'''
sql = f"""
WITH subquery AS (
SELECT {field_name}
FROM {table_name}
LIMIT {sample_size}
)
SELECT COUNT(*) as count
FROM subquery
GROUP BY {field_name}
HAVING COUNT(*) >=
CASE
WHEN (SELECT COUNT(*) FROM subquery) < {sample_size} THEN (SELECT COUNT(*) FROM {table_name}) / 2
ELSE {sample_size} / 2
END;
"""
'''

# 默认采用子查询兼容MySQL 5.7版本
sql = f"""
SELECT COUNT(*) as count
FROM (
SELECT {field_name}
FROM {table_name}
WHERE {where_clause_value}
LIMIT {sample_size}
) AS subquery
GROUP BY {field_name}
HAVING COUNT(*) >= CASE WHEN (SELECT COUNT(*) FROM {table_name} LIMIT {sample_size}) < {sample_size}
THEN (SELECT COUNT(*) FROM {table_name}) / 2 ELSE {sample_size} / 2 END;
"""

#print(sql)
with Progress(TextColumn("[progress.description]{task.description}", justify="right"), BarColumn(), TextColumn("[progress.percentage]{task.percentage:>3.0f}%"), TimeElapsedColumn()) as progress:
task = progress.add_task(f"[cyan]Executing SQL query [bold magenta]{table_name}[/bold magenta] [cyan]where_clause [bold magenta]{where_clause_value}[/bold magenta]...", total=1)
cursor.execute(sql)
progress.update(task, completed=1)

results = cursor.fetchall()

if results:
# 如果有超过半数的重复数据
return results
else:
return False
26 changes: 26 additions & 0 deletions Flask_src/sql_extra.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import re

def check_percent_position(string):
string = string.lower()
pattern = r".*like\s+'%|.*like\s+concat\(+'%|.*regexp\s+"
matches = re.findall(pattern, string)
if matches:
like_pattern = r"like\s+(?:concat\(.*?\)|'%%'|\'.*?%(?:.*?)?\')"
like_match = re.search(like_pattern, string)
if like_match:
return True, like_match.group()
#return True
return False, None


def extract_function_index(string):
#pattern = r'\b(\w+)\('
#pattern = r'\b(\w+)\(.*\).*[>=<!=<>]'
pattern = r'\b(\w+(\(.*\).*[>=<!=<>]))'
matches = re.findall(pattern, string)
#function_indexes = set(matches)
function_indexes = [match[0] for match in matches]
if function_indexes:
return ', '.join(function_indexes)
else:
return False
12 changes: 12 additions & 0 deletions Flask_src/sql_format_class.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import sqlparse

class SQLFormatter:
def format_sql(self, sql_query):
"""
格式化 SQL 查询语句
"""
formatted_sql = sqlparse.format(sql_query, reindent=True, keyword_case='upper')

return formatted_sql


106 changes: 106 additions & 0 deletions Flask_src/sql_index.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
import textwrap
from tabulate import tabulate
import pymysql

def execute_index_query(mysql_settings, database, table_name, index_columns):
index_columns = index_columns
index_columns = index_columns.split(',')
updated_columns = [f"'{column.strip()}'" for column in index_columns]
final_columns = ', '.join(updated_columns)
sql = f"SELECT TABLE_NAME,INDEX_NAME,COLUMN_NAME,CARDINALITY FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = '{database}' AND TABLE_NAME = '{table_name}' AND COLUMN_NAME IN ({final_columns})"
#print(sql)
try:
conn = pymysql.connect(**mysql_settings)
cur = conn.cursor()
cur.execute(sql)
index_result = cur.fetchall()

if not index_result:
print(f"没有检测到 {table_name} 表 字段 {final_columns} 有索引。")

# 提取列名
e_column_names = [desc[0] for desc in cur.description]

# 提取结果值并进行自动换行处理
e_result_values = []
for row in index_result:
values = list(row.values())
wrapped_values = [textwrap.fill(str(value), width=30) for value in values]
e_result_values.append(wrapped_values)

# 将结果格式化为表格(包含竖线)
e_table = tabulate(e_result_values, headers=e_column_names, tablefmt="grid", numalign="left")

return e_table

except pymysql.err.ProgrammingError as e:
print("MySQL 内部错误:",e)
return None
except Exception as e:
print("MySQL 内部错误:",e)
return None
finally:
if cur:
cur.close()
if conn:
conn.close()

#########################################################

def check_index_exist(mysql_settings, table_name, index_column):
show_index_sql = f"show index from {table_name} where Column_name = '{index_column}'"
try:
conn = pymysql.connect(**mysql_settings)
cur = conn.cursor()
cur.execute(show_index_sql)
index_result = cur.fetchall()

#if not index_result:
#print(f"没有检测到 {table_name} 表 字段 {final_columns} 有索引。")

return index_result

except pymysql.err.ProgrammingError as e:
print("MySQL 内部错误:",e)
return None
except Exception as e:
print("MySQL 内部错误:",e)
return None
finally:
if cur:
cur.close()
if conn:
conn.close()

#########################################################

def check_index_exist_multi(mysql_settings, database, table_name, index_columns, index_number):
index_columns = index_columns
index_columns = index_columns.split(',')
updated_columns = [f"'{column.strip()}'" for column in index_columns]
final_columns = ', '.join(updated_columns)
sql = f"SELECT TABLE_NAME,INDEX_NAME,COLUMN_NAME,CARDINALITY FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = '{database}' AND TABLE_NAME = '{table_name}' AND COLUMN_NAME IN ({final_columns}) GROUP BY INDEX_NAME HAVING COUNT(INDEX_NAME) = {index_number}"
#print(sql)
try:
conn = pymysql.connect(**mysql_settings)
cur = conn.cursor()
cur.execute(sql)
index_result = cur.fetchall()

if not index_result:
return None

return index_result

except pymysql.err.ProgrammingError as e:
print("MySQL 内部错误:",e)
return None
except Exception as e:
print("MySQL 内部错误:",e)
return None
finally:
if cur:
cur.close()
if conn:
conn.close()

36 changes: 36 additions & 0 deletions Flask_src/sqlai.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
from vanna.remote import VannaDefault

def optimize_sql(original_sql):
"""
调用 vanna.ai LLM 接口优化 SQL 查询语句,并返回优化后的 SQL 字符串。

Args:
original_sql (str): 原始的 SQL 查询语句。

Returns:
str: 优化后的 SQL 查询语句。 如果调用过程中发生错误,则返回包含错误信息的字符串。
"""
try:
# 创建 VannaDefault 实例
vn = VannaDefault(model='sql_helper', api_key='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')

# 输出调用信息 (可选,仅用于调试)
print('\033[94m以下是调用的vanna.ai LLM接口.\033[0m')
print('优化前的SQL是:')
print(original_sql)
print('-' * 55)

# 获取优化后的 SQL
#vn.ask('How to optimize this SQL : {}'.format(original_sql))
optimized_sql = vn.generate_sql('How to optimize this SQL : {}'.format(original_sql))

# 输出优化后的 SQL (可选,仅用于调试)
print('\033[92m优化后的SQL是:\033[0m')

return optimized_sql

except Exception as e:
# 捕获异常,返回包含错误信息的字符串
error_message = f"调用 vanna.ai 优化出错: {e}"
print(error_message) # 打印错误信息到控制台 (可选)
return error_message
Loading