Python 使用正则表达式解析更新语句

Python parsing update statements using regex

我试图在 python 中找到一个正则表达式,它将能够处理我从我的数据库中抛出的大部分更新查询。我不能使用 sqlparse 或任何其他可能对此有用的库,我只能使用 python 的内置模块或 cx_Oracle,以防它有一个我没有的方法意识到这一点可以做这样的事情。

大多数更新查询如下所示:

UPDATE TABLE_NAME SET COLUMN_NAME=2, OTHER_COLUMN=to_date('31-DEC-202023:59:59','DD-MON-YYYYHH24:MI:SS'), COLUMN_STRING='Hello, thanks for your help', UPDATED_BY=-100 WHERE CODE=9999;

我使用的大多数更新查询都有这些类型的更新版本。输出必须是一个列表,包括每个单独的 SQL 关键字(UPDATE、SET、WHERE)、每个单独的更新语句(即 COLUMN_NAME=2)和最终标识符(CODE=9999)。

理想情况下,结果应该是这样的:

list = ['UPDATE', 'TABLE_NAME', 'SET', 'COLUMN_NAME=2', 'OTHER_COLUMN=("31-DEC-2020 23:59:59","DD-MON-YYYY HH24:MI:SS")', COLUMN_STRING='Hello, thanks for your help', 'UPDATED_BY=-100', 'WHERE', 'CODE=9999']

最初我尝试使用 string.split() 拆分空格来执行此操作,但是在处理我的一个稍微复杂的查询(如上面的查询)时,split 方法处理不当由于这些更新中的空格,我尝试在 COLUMN_STRINGOTHER_COLUMN 中进行的字符串更新。

让我们使用 shlex 模块:

import shlex
test="UPDATE TABLE_NAME SET COLUMN_NAME=2, OTHER_COLUMN=to_date('31-DEC-202023:59:59','DD-MON-YYYYHH24:MI:SS'), COLUMN_STRING='Hello, thanks for your help', UPDATED_BY=-100 WHERE CODE=9999;"

t=shlex.split(test)

到这里为止,我们不会去掉逗号分隔符和最后一个半分隔符,所以也许我们可以这样做:

for i in t:
    if i[-1] in [',',';']:
        i=i[:-1]

如果我们打印该列表的每个元素,我们将得到:

UPDATE
TABLE_NAME
SET
COLUMN_NAME=2
OTHER_COLUMN=to_date(31-DEC-202023:59:59,DD-MON-YYYYHH24:MI:SS)
COLUMN_STRING=Hello, thanks for your help
UPDATED_BY=-100
WHERE
CODE=9999

不是一个合适的通用答案,但符合我希望的目的。