使用sqlGlot解析sql

问题描述 投票:0回答:1

我正在尝试给定查询中的列名、表名。对于更简单的查询,我能够得到它们。但是,对于时间戳看起来为 UTC 格式的此查询,它会抱怨。不喜欢“T23”(它强调这一点......当从终端看到时)。

任何人都可以帮助我如何解析具有这种时间戳类型的 SQL 吗?

>>> from sqlglot import parse_one, exp
q = 'SELECT Info,Type,Username FROM MyTbl WHERE EventDate >= 2024-03-20T23:45:43.216000+00:00 AND EventDate <= 2024-03-21T00:50:00.637052+00:00 ORDER BY EventDate DESC LIMIT 10000'
column_list = []


>>> for column in parse_one(q).find_all(exp.Column):
...     col = column.alias_or_name
...     column_list.append(col)
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/sri/.pyenv/versions/3.10.13/envs/ve_3.10.13/lib/python3.10/site-packages/sqlglot/__init__.py", line 139, in parse_one
    result = dialect.parse(sql, **opts)
  File "/Users/sri/.pyenv/versions/3.10.13/envs/ve_3.10.13/lib/python3.10/site-packages/sqlglot/dialects/dialect.py", line 503, in parse
    return self.parser(**opts).parse(self.tokenize(sql), sql)
  File "/Users/sri/.pyenv/versions/3.10.13/envs/ve_3.10.13/lib/python3.10/site-packages/sqlglot/parser.py", line 1170, in parse
    return self._parse(
  File "/Users/sri/.pyenv/versions/3.10.13/envs/ve_3.10.13/lib/python3.10/site-packages/sqlglot/parser.py", line 1239, in _parse
    self.raise_error("Invalid expression / Unexpected token")
  File "/Users/sri/.pyenv/versions/3.10.13/envs/ve_3.10.13/lib/python3.10/site-packages/sqlglot/parser.py", line 1280, in raise_error
    raise error
sqlglot.errors.ParseError: Invalid expression / Unexpected token. Line 1, Col: 69.
  SELECT Info,Type,Username FROM MyTbl WHERE EventDate >= 2024-03-20T23:45:43.216000+00:00 AND EventDate <= 2024-03-21T00:50:00.637052+00:00 ORDER BY EventDate DESC LIMIT 
>>> 
sqlglot
1个回答
0
投票

您缺少时间戳周围的引号。

一种选择是,您可以在整个字符串周围使用双引号,并在时间戳处使用单引号。

另一种选择是保留整个字符串周围的单引号,并使用 \' 将时间戳周围的单引号转义。

见下文。

q = "SELECT Info,Type,Username FROM MyTbl WHERE EventDate >= '2024-03-20T23:45:43.216000+00:00' AND EventDate <= '2024-03-21T00:50:00.637052+00:00' ORDER BY EventDate DESC LIMIT 10000"

q = 'SELECT Info,Type,Username FROM MyTbl WHERE EventDate >= \'2024-03-20T23:45:43.216000+00:00\' AND EventDate <= \'2024-03-21T00:50:00.637052+00:00\' ORDER BY EventDate DESC LIMIT 10000'

打印“column_list”产量:
['信息', '类型', '用户名', '事件日期', '事件日期', '事件日期']

© www.soinside.com 2019 - 2024. All rights reserved.