python - 正则表达式在 SQL 中获取值
问题描述
我正在尝试读取 SQL 的键值内的值,即 UPDATE、SET、FROM 和 WHERE。使用正则表达式,我可以在 where 子句之后的第一行之前获取值,但无法获得完整的 where 子句。请建议。
需要从中获取值的示例 SQL。
UPDATE dbname.tablename
SET
alias1=T1.col1,
alias2=T1.col2
FROM datafabric_cfd_dea.T1 T1
WHERE
tablename.keycol =T1.keycol
AND tablename.col3='ABC'
AND T1.col3='ABC'
AND tablename.col3=T1.col3
AND T1.col2='XYZ';
正则表达式:
UPDATE\s*(.*)\s*SET\s*(.*)\s*FROM\s*(.*)\s*WHERE\s*(.*)
请建议。
解决方案
我不认为正则表达式是最适合这项工作的工具。由于我们在 Python 生态系统中运行,我们很幸运能够在 PyPI 上使用大量第三方包的强大功能。有一个流行的包叫做sqlparse
它实现了一个 SQL 解析器。
您可以解析您的 SQL 语句并分析解析的标记:
In [1]: import sqlparse
In [2]: sql = """ UPDATE dbname.tablename
...: SET
...: alias1=T1.col1,
...: alias2=T1.col2
...: FROM datafabric_cfd_dea.T1 T1
...: WHERE
...: tablename.keycol =T1.keycol
...: AND tablename.col3='ABC'
...: AND T1.col3='ABC'
...: AND tablename.col3=T1.col3
...: AND T1.col2='XYZ';"""
In [3]: parsed_sql = sqlparse.parse(sql)
# get the where clause
In [4]: where_clause = next(token for token in parsed_sql[0].tokens
if isinstance(token, sqlparse.sql.Where))
In [5]: where_clause.tokens
Out[5]:
[<Keyword 'WHERE' at 0x10FCD1A78>,
<Newline ' ' at 0x10FCD1668>,
<Whitespace ' ' at 0x10FCD1B48>,
<Comparison 'tablen...' at 0x10FCCDB50>,
<Newline ' ' at 0x10FCD1AE0>,
...
<Comparison 'T1.col...' at 0x10FCCDD50>,
<Punctuation ';' at 0x10FCF5EF0>]
推荐阅读
- c# - 无法使用 i2c 从 FTDI FT201X 中获取数据
- r - drive_auth() 函数未在密码提交时创建 gargle-oauth 令牌
- android - 从 Firebase 数据库中检索数据时应用程序崩溃
- scala - 在火花中将列转换为二进制数据类型
- excel - 由于 Excel 未释放内存而导致的“内存不足”错误
- pandas - 将函数应用于数据框中的列列表
- google-apps-script - Google 表格 ImportXML 定期刷新且不缓存
- azure - 如何使用 AzureCLI 按日期删除 Azure Blob 存储中的文件?
- c - libavcodec/libx264 不尊重 keyint_min
- octave - 在 linux 控制台中为 UTF-8 配置 Octave