相关疑难解决方法(0)

用Python解析SQL

我想在非关系数据存储之上创建一个SQL接口.非关系数据存储,但以关系方式访问数据是有意义的.

我正在研究使用ANTLR生成一个AST,它将SQL表示为关系代数表达式.然后通过评估/遍历树来返回数据.

我之前从未实现过解析器,因此我想就如何最好地实现SQL解析器和求值程序提出一些建议.

  • 上述方法听起来不错吗?
  • 我应该研究其他工具/库吗?像PLYPyparsing.
  • 指向可以帮助我的文章,书籍或源代码的指标表示赞赏.

更新:

我使用pyparsing实现了一个简单的SQL解析器.结合对我的数据存储实现关系操作的Python代码,这非常简单.

正如我在其中一条评论中所说,演习的重点是将数据提供给报告引擎.为此,我可能需要实现ODBC驱动程序.这可能是很多工作.

python sql parsing pyparsing

42
推荐指数
3
解决办法
4万
查看次数

如何使用正则表达式按顺序提取文本?

我正在研究一个 python 流脚本。它基本上解析 SQL 语句并获取目标表和源表。例子

CREATE TABLE TAR_TAB1 AS
SELECT * FROM SRC_TAB1 JOIN SRC_TAB2

CREATE TABLE TAR_TAB2 AS 
SELECT * FROM SRC_TAB3 JOIN SRC_TAB4

INSERT INTO TAR_TAB3 AS
SELECT * FROM SRC_TAB5 JOIN SRC_TAB6

Run Code Online (Sandbox Code Playgroud)

我写了正则表达式

target = re.findall(r'\w+(?=\s+AS)', data)
source = re.findall(r'(?:FROM|JOIN)\s*([^\s]+), data)
Run Code Online (Sandbox Code Playgroud)

结果如预期,

target list contains, TAR_TAB1, TAR_TAB2, TAR_TAB3
source list contains, SRC_TAB1, SRC_TAB2, SRC_TAB3, SRC_TAB4, ETC
Run Code Online (Sandbox Code Playgroud)

如何获得像列表或数据帧一样的输出,最好是数据帧,因此提取流程不会受到干扰。

target         source
TAR_TAB1       SRC_TAB1
TAR_TAB1       SRC_TAB2
TAR_TAB2       SRC_TAB3
TAR_TAB2       SRC_TAB4
TAR_TAB3       SRC_TAB5
TAR_TAB4       SRC_TAB6
Run Code Online (Sandbox Code Playgroud)

python regex

6
推荐指数
1
解决办法
176
查看次数

如何在 SQL 脚本中提取表名?

假设有一个sql脚本:

select *
from (
  select col1 from test.test_a join test.test_a1 on a.col1 = a1.col1) a
left join test.test_b b 
on a.col1 = b.col2
left join
    test.test_c c
on b.col2  = c.col3
left jon
   (select 
       col4 
    from
       test.test_d) d
on c.col3  = d.col4
Run Code Online (Sandbox Code Playgroud)

我正在阅读这个问题,并尝试使用 python 在上面的脚本中提取“ from”或“ join”之后的所有表名。困难是我正在逐行处理脚本,但表名和关键字可能不在同一行。

那么如何从脚本中提取这样的表名呢?任何建议表示赞赏。

python parsing

1
推荐指数
1
解决办法
4135
查看次数

标签 统计

python ×3

parsing ×2

pyparsing ×1

regex ×1

sql ×1