首页 > 解决方案 > 判断一条sql语句是否以单词SELECT开头

问题描述

我正在尝试对输入 SQL 字符串进行一些基本验证。我想确保查询的第一个单词是SELECT,否则我会引发错误。这里有些例子:

1) yes
SELECT * FROM table

2) no
# SELECT * FROM table;
DROP TABLE table;

3) no
   /* SELECT * FROM 
   TABLE */ DROP TABLE table;

4) yes
# here is a comment
SELECT * FROM table

5) yes
/* here is a
comment */ SELECT * FROM table

和其他各种。也许这更像是一个正则表达式解决方案或 string.replace。但是,查看是否已输入 SQL SELECT 语句的好方法是什么?

标签: pythonmysqlsqlregex

解决方案


虽然可以使用正则表达式和其他基于文本的技巧,但正确的 SQL 解析器(例如https://pypi.org/project/sqlparse/)是可行的方法。例如:

import sqlparse
statements = sqlparse.parse(my_evil_sql)
for statement in statements:
  if statement.get_type() != "SELECT":
    raise Exception("Non-select statement encountered!")

请注意,get_type()忽略语句开头的空格和注释。


推荐阅读