Skip to main content

基于 ANTLR4 的通用 SQL 重写工具,特别适用于 LLM 生成的 SQL 权限管理

Project description

SQL Rewriter - 基于 ANTLR4 的 SQL 重写工具

基于g4词法分析和语法分析文件解析sql语法树进行sql改写。

目前提供了 add_where_condition 一个函数,主要针对大模型生成sql提供权限管理工具。用语法解析代替正则匹配,让用户在处理大模型生成的各种奇葩 SQL 时更方便的进行权限管理。

工作原理

使用 ANTLR4 把 SQL 语句解析成语法树,然后用 Visitor 模式遍历语法树,找到目标表的查询位置,智能地添加或合并 WHERE 条件。如果原 SQL 已经有 WHERE 子句,会先给原条件加个括号,然后再用 AND 连接新的权限条件(避免大模型sql注入)。

安装

pip install sql-rewriter

或者从源码安装(如果你要改代码的话):

git clone https://github.com/wangyang377/sql-rewriter.git
cd sql-rewriter
./scripts/generate_parser.sh  # 需要先安装 ANTLR4,见下方开发部分
pip install -e .

使用方法

基本用法

from sql_rewriter import add_where_condition

# 没有 WHERE 子句的情况,直接添加
sql = "SELECT * FROM users;"
new_sql = add_where_condition(sql, "age > 18", "users")
# 结果: SELECT * FROM users WHERE age > 18;

# 已有 WHERE 子句的情况,会加括号后追加
sql = "SELECT * FROM users WHERE age > 18;"
new_sql = add_where_condition(sql, "status = 'active'", "users")
# 结果: SELECT * FROM users WHERE (age > 18) AND status = 'active';

# JOIN 查询,只针对特定表添加条件
sql = "SELECT * FROM users JOIN orders ON users.id = orders.user_id;"
new_sql = add_where_condition(sql, "users.status = 'active'", "users")
# 结果: SELECT * FROM users JOIN orders ON users.id = orders.user_id WHERE users.status = 'active';

# 嵌套查询也没问题,会精准定位到目标表
sql = "SELECT * FROM orders WHERE status = 'pending' AND EXISTS (SELECT 1 FROM users WHERE users.id = orders.user_id);"
new_sql = add_where_condition(sql, "users.status = 'active'", "users")
# 结果: SELECT * FROM orders WHERE status = 'pending' AND EXISTS (SELECT 1 FROM users WHERE users.id = orders.user_id AND users.status = 'active');

API 说明

add_where_condition(sql_text, new_condition, table_name=None)

参数:

  • sql_text: 原始 SQL 语句
  • new_condition: 要添加的 WHERE 条件(不需要包含 WHERE 关键字)
  • table_name: 目标表名,只有查询中包含这个表时才会添加条件。传 None 的话就不处理

返回值:

  • 修改后的 SQL 语句(字符串)

异常:

  • ValueError: SQL 解析失败时会抛出

开发指南

如果你从 Git 克隆了项目,需要先生成 ANTLR 解析器代码:

# 安装 ANTLR4(macOS)
brew install antlr

# Linux (Ubuntu/Debian)
sudo apt-get install antlr4

# 然后生成代码
./scripts/generate_parser.sh

运行测试:

cd tests
python test_parser.py

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sql_rewriter-0.1.0.tar.gz (221.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sql_rewriter-0.1.0-py3-none-any.whl (223.3 kB view details)

Uploaded Python 3

File details

Details for the file sql_rewriter-0.1.0.tar.gz.

File metadata

  • Download URL: sql_rewriter-0.1.0.tar.gz
  • Upload date:
  • Size: 221.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.6

File hashes

Hashes for sql_rewriter-0.1.0.tar.gz
Algorithm Hash digest
SHA256 358458f25bc1fae8f764e797f56a641e733111d2cac0827795704e9bd9b7cda8
MD5 53a6aa4ceaee2b6e7561cc579fda5a42
BLAKE2b-256 cc5f967a74d296273919d9d113823648bf0367b1e5dbd324186ff5dbc874bfff

See more details on using hashes here.

File details

Details for the file sql_rewriter-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: sql_rewriter-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 223.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.6

File hashes

Hashes for sql_rewriter-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 dceb5fb429aead5fb76a98e415b4f257e53a8c2b7115d3bae942f05e60426074
MD5 a0eab91c0fa9283fb591ed61229c9fd1
BLAKE2b-256 65d1a60a6bc9eba95261278cde437b9b06c6d87f1a894a5bad9dd86519f4cff9

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page