问题标签 [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.
java - 如何使用 gsqlarser 从连接条件中获取表名?
我正在尝试从这里实现 sqlparser 并使用 gsqlparser 。jar 的来源是 Java,但我在 Scala 中实现了相同的。
下面是我的查询,其中包含一个连接条件。
我能够解析查询以读取列的名称和别名、条件、表名(直接在查询中检查表名),如下所示。
输出:
我正在尝试解析连接条件并获取其中的详细信息
这里的问题是查询中只有一个连接条件,因此返回的大小为 1。因此输出为scott.employees
. 如果我这样做有点不同,如下所示getJoinItems
我通过从连接条件中截断第一个表来获得输出,如下所示:
方法:getJoinItems() 返回一个列表:TJoinItemList
我想遍历它。但即使它的大小也是 1。
我现在没有主意了。谁能让我知道如何解析查询的联接条件并获取联接内的表名?
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(...)
方法..
谢谢
antlr - 如何获取 ANTLR 词法分析器对象的参数?
我正在编写一个 JAVA 软件来解析 SQL 查询。为此,我将 ANTLR 与 presto.g4 一起使用。我目前使用的代码非常标准:
我想知道是否可以将参数传递给词法分析器,因此词法分析会有所不同取决于该参数?
更新: 我在下面使用了@Mike 的建议,我的词法分析器现在继承自内置词法分析器并添加了一个谓词函数。我的问题现在是纯语法。
这是我的字符串定义:
我有时会有一个奇怪的转义查询,谓词返回 true。例如:
当我尝试解析它时,我得到:'\'',''),'
作为单个字符串。我该如何处理这个?
regex - 处理不同的转义序列?
我使用 ANTLR 和 Presto 语法来解析 SQL 查询。这是我用来解析查询的原始字符串定义:
这对大多数查询都有效,直到我看到具有不同转义规则的查询。例如:
所以我修改了我的字符串定义,现在它看起来像:
但是,这不适用于上面提到的查询,因为我得到
作为单个字符串。谓词为以下查询返回 True。知道如何处理这个查询吗?
谢谢,尼尔。
python - 如何使用 sqlparse 从子查询中提取表名?
我正在尝试使用 sqlparse 提取查询中的所有表名,但我遇到了用括号括起来的子查询或插入语句的问题。
我有以下查询,
当我查找在括号中包含语句的标记时,使用
我得到以下结果,
结果仅作为一个标识符令牌返回。当我尝试从括号内获取表名时,所有返回的是 test.test_table。我最终要做的是提取两个表名 test.test_table 和 fake.table
有没有人对我如何去做这件事有任何见解?
python - 如何使用sqlparse解析sql语句
我正在尝试解析 PostgreSQL 数据库中用户(在一段时间内)执行的所有查询(通过查询 pg_stat_statements 表)并尝试创建用户使用哪些表来运行Select或Insert或删除查询。基本上运行类似Select query, queryid, userid from pg_stat_state
然后解析每个查询以检查它是Select还是Insert或Delete查询,并从查询中提取 table_Name 。
我正在使用 sqlparse python 模块,但对它很新,所以需要帮助。我可以使用以下方法获取表名:
但不确定如何获取语句类型(选择/插入/删除)以及表名。此外,还需要将 COPY 语句合并为 Selects。
我尝试使用psqlparse,但我没有在网上看到太多关于这个模块的信息/帮助。
请建议。
谢谢。
python - 用python解析SQL查询连接
我正在尝试解析 sql 查询。我使用[moz-sql-parser][1]
来识别查询中的 sql 部分,然后编写一个函数来解析表名和加入的列。
我在下面有一个示例查询:
当通过moz-sql-parser
收益率运行时:
现在我编写了可以解析表名和列名的函数:
它会产生 2 个列表,如下所示:
和
但这里的诀窍是所需的输出看起来像
我的目标是解析类似的查询,我可以在其中将输出构建到数据框/列表,但很难以这种特殊的方式输出解析。任何线索将不胜感激。
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'} }
基本上它应该支持所有可能的子句及其组合。
python - 元组索引超出范围 - 但仅在函数中运行时
我正在尝试使用 SQLParse 编写一个过程,该过程列出了 SQL 语句中存在的表,目前专注于查询的“FROM”子句。我还在尝试识别 FROM 子句中的嵌套查询(或子查询)并再次运行该过程以识别该嵌套查询中的表。
使用此示例查询
下面是代码,它正在工作:
这从查询开始,并通过搜索单词 select 来识别子查询,然后我有了这个。
然后删除最外层的括号并解析为新的 SQL 语句。这一切正常,如果我通过前面的代码块手动运行这个解析的语句,它会按预期工作。
然后我尝试将其放入单独的函数中:
- 首先解析查询并调用:
- 一个扫描 FROM 子句并返回表的函数,但如果它标识一个子查询,它会调用:
- 一个函数,它删除脚本最外层的括号,然后调用第一个函数将其通过进程发送回来。
但是当它尝试运行时会发生sqlparse.parse(res_sub)[0]
元组索引超出范围。它不应该是一个元组,它应该是一个 str,然后将其解析为 sqlparse.sql.Statement。
我不明白为什么它的行为不同只是因为我把它放到了一系列函数中。功能代码如下:
我应该强调我并不精通 Python,而且我在学习的过程中学到了很多东西!
谢谢
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:
你会明白我的意思。