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



我试图在python中找到一个regex表达式,它将能够处理我从DB抛出的大多数UPDATE查询。我不能使用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)、每个单独的更新语句(i。e 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

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

最新更新