问题标签 [sql-parser]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
51 浏览

java - 如何使用 gsqlarser 从连接条件中获取表名?

我正在尝试从这里实现 sqlparser 并使用 gsqlparser 。jar 的来源是 Java,但我在 Scala 中实现了相同的。

下面是我的查询,其中包含一个连接条件。

我能够解析查询以读取列的名称和别名、条件、表名(直接在查询中检查表名),如下所示。

输出:

我正在尝试解析连接条件并获取其中的详细信息

这里的问题是查询中只有一个连接条件,因此返回的大小为 1。因此输出为scott.employees. 如果我这样做有点不同,如下所示getJoinItems

我通过从连接条件中截断第一个表来获得输出,如下所示:

方法:getJoinItems() 返回一个列表:TJoinItemList我想遍历它。但即使它的大小也是 1。

我现在没有主意了。谁能让我知道如何解析查询的联接条件并获取联接内的表名?

0 投票
1 回答
322 浏览

presto - SQL Parser 访问者 + 元数据库 + Presto

我面临着一个看似很容易的问题,但我无法解决这个问题以找到合适的解决方案。

问题
我需要以“奇怪”(双引号中的模式)的方式将模式附加到我的 SQL 语句中。

上下文
基本上,我们正在托管和公开一个 Metabase 工具,该工具将使用 Presto SQL 连接并在我们的 Hive 数据库上执行查询。

Metabase 允许客户编写 SQL 语句和一些客户,他们只是不键入语句上的模式。今天我们为这些查询抛出错误,但我可以轻松地从 Authorization 标头中检索模式值,因为在我们的多租户产品中,模式是该用户登录的租户 ID,并且有了这些信息,我可以附加到客户 SQL 语句并避免错误。

假设客户输入了以下语句:

我应该将其转换为(添加“SCHEMA”):

仍在尝试找到仅使用presto-parser访客 + 仪器解决方案的解决方案。另外,我知道 JSQLParser 并且我尝试过,但我总是回来尝试找到一个“简单”的解决方案,害怕 JSQLParser 将无法支持所有与标准 SQL 有点不同的 Presto/Hive 查询;

我在 GitHub 上创建了一个带有测试用例的小项目来验证..

https://github.com/genyherrera/prestosqlerror

但是对于那些不想克隆存储库的人,这里是类和依赖项:

PS:我能够在没有双引号的情况下添加架构,但我遇到了identifiers must not start with a digit; surround the identifier with double quotes错误。基本上这个错误来自SqlParser$PostProcessor.exitDigitIdentifier(...)方法..

谢谢

0 投票
2 回答
138 浏览

antlr - 如何获取 ANTLR 词法分析器对象的参数?

我正在编写一个 JAVA 软件来解析 SQL 查询。为此,我将 ANTLR 与 presto.g4 一起使用。我目前使用的代码非常标准:

我想知道是否可以将参数传递给词法分析器,因此词法分析会有所不同取决于该参数?

更新: 我在下面使用了@Mike 的建议,我的词法分析器现在继承自内置词法分析器并添加了一个谓词函数。我的问题现在是纯语法。

这是我的字符串定义:

我有时会有一个奇怪的转义查询,谓词返回 true。例如:

当我尝试解析它时,我得到:'\'',''),'

作为单个字符串。我该如何处理这个?

0 投票
2 回答
79 浏览

regex - 处理不同的转义序列?

我使用 ANTLR 和 Presto 语法来解析 SQL 查询。这是我用来解析查询的原始字符串定义:

这对大多数查询都有效,直到我看到具有不同转义规则的查询。例如:

所以我修改了我的字符串定义,现在它看起来像:

但是,这不适用于上面提到的查询,因为我得到

作为单个字符串。谓词为以下查询返回 True。知道如何处理这个查询吗?

谢谢,尼尔。

0 投票
1 回答
221 浏览

python - 如何使用 sqlparse 从子查询中提取表名?

我正在尝试使用 sqlparse 提取查询中的所有表名,但我遇到了用括号括起来的子查询或插入语句的问题。

我有以下查询,

当我查找在括号中包含语句的标记时,使用

我得到以下结果,

结果仅作为一个标识符令牌返回。当我尝试从括号内获取表名时,所有返回的是 test.test_table。我最终要做的是提取两个表名 test.test_table 和 fake.table

有没有人对我如何去做这件事有任何见解?

0 投票
1 回答
451 浏览

python - 如何使用sqlparse解析sql语句

我正在尝试解析 PostgreSQL 数据库中用户(在一段时间内)执行的所有查询(通过查询 pg_stat_statements 表)并尝试创建用户使用哪些表来运行SelectInsert或删除查询。基本上运行类似Select query, queryid, userid from pg_stat_state然后解析每个查询以检查它是Select还是InsertDelete查询,并从查询中提取 table_Name 。

我正在使用 sqlparse python 模块,但对它很新,所以需要帮助。我可以使用以下方法获取表名:

但不确定如何获取语句类型(选择/插入/删除)以及表名。此外,还需要将 COPY 语句合并为 Selects。

我尝试使用psqlparse,但我没有在网上看到太多关于这个模块的信息/帮助。

请建议。

谢谢。

0 投票
1 回答
297 浏览

python - 用python解析SQL查询连接

我正在尝试解析 sql 查询。我使用[moz-sql-parser][1]来识别查询中的 sql 部分,然后编写一个函数来解析表名和加入的列。

我在下面有一个示例查询:

当通过moz-sql-parser收益率运行时:

现在我编写了可以解析表名和列名的函数:

它会产生 2 个列表,如下所示:

但这里的诀窍是所需的输出看起来像

我的目标是解析类似的查询,我可以在其中将输出构建到数据框/列表,但很难以这种特殊的方式输出解析。任何线索将不胜感激。

0 投票
1 回答
179 浏览

java - 解析 SQL 查询字符串以获取值的映射

我有一个 java 项目,其中 PreparedStatements 没有在任何 SQL 查询中使用。现在我想为所有这些查询实现 PreparedStatements。而不是通过放置“?”来修改每个查询 ,我想写一个函数,它接受 SQL 查询字符串,它解析它并返回各种 SQL 子句的值的映射。

几个例子是

sqlString : select * from table t where columnA = 'hello' AND columnB = 'hai'
输出: { {1,'hello'} , {2,'hai'} }

sqlString : select * from table t where columnA IN ('hello' ,'hai')
output : { {1,'hello'} , {2,'hai'} }

sqlString : select * from table t where columnA > 17 AND columnB BETWEEN 10 AND 20;
输出:{ {1,'17'} , {2, '10' } , {3, '20'} }

基本上它应该支持所有可能的子句及其组合。

0 投票
2 回答
60 浏览

python - 元组索引超出范围 - 但仅在函数中运行时

我正在尝试使用 SQLParse 编写一个过程,该过程列出了 SQL 语句中存在的表,目前专注于查询的“FROM”子句。我还在尝试识别 FROM 子句中的嵌套查询(或子查询)并再次运行该过程以识别该嵌套查询中的表。

使用此示例查询

下面是代码,它正在工作:

这从查询开始,并通过搜索单词 select 来识别子查询,然后我有了这个。

然后删除最外层的括号并解析为新的 SQL 语句。这一切正常,如果我通过前面的代码块手动运行这个解析的语句,它会按预期工作。

然后我尝试将其放入单独的函数中:

  • 首先解析查询并调用:
  • 一个扫描 FROM 子句并返回表的函数,但如果它标识一个子查询,它会调用:
  • 一个函数,它删除脚本最外层的括号,然后调用第一个函数将其通过进程发送回来。

但是当它尝试运行时会发生sqlparse.parse(res_sub)[0]元组索引超出范围。它不应该是一个元组,它应该是一个 str,然后将其解析为 sqlparse.sql.Statement。

我不明白为什么它的行为不同只是因为我把它放到了一系列函数中。功能代码如下:

我应该强调我并不精通 Python,而且我在学习的过程中学到了很多东西!

谢谢

0 投票
1 回答
93 浏览

python - SQLParse - 通配符 LIKE 条件问题

我专注于 SQL 语句的 Where 子句,并试图撤回 Where 子句中使用的所有列。下面是一个示例 SQL:

我期待的列是 T.JOIN_DT、T.POSTING_DT、T.PERS_ID 和 T.LEAVE_DT。下面的代码能够提取除 T.PERS_ID 之外的所有内容

似乎将 'AND P.PERS_ID LIKE '%123' 分组为一个令牌,我不确定如何进一步分解它以获得标识符 P.PERS_ID。如果你添加print(condition)之后for condition in item.tokens:你会明白我的意思。