当前位置: 首页 > news >正文

【PGCCC】 pg_query 6.0:使用 Postgres 自己的解析器解析、反解析和规范化 SQL 查询的 Ruby 库

pg_query

这个 Ruby 扩展使用实际的 PostgreSQL 服务器源来解析 SQL 查询并返回内部 PostgreSQL 解析树。

此外,该扩展允许您规范化查询(用 $n 替换常量值)并将这些规范化的查询再次解析为解析树。

当您构建此扩展时,它会构建 PostgreSQL 服务器源的部分(参见libpg_query),然后将其静态链接到此扩展中。

这看起来很复杂,但这是解析所有有效 PostgreSQL 查询的唯一可靠方法。

您可以在此处找到更多示例和更长的理由:https ://pganalyze.com/blog/parse-postgresql-queries-in-ruby.html

安装

gem install pg_query

由于编译 PostgreSQL 的部分内容,在较慢的系统
上安装可能需要一段时间。预计最多需要 5 分钟。

用法

解析查询

PgQuery.parse("SELECT 1")=> #<PgQuery::ParserResult:0x000000012ec4e9e0@query="SELECT 1",@tree=<PgQuery::ParseResult:version: 160001,stmts: [<PgQuery::RawStmt:stmt: <PgQuery::Node:select_stmt: <PgQuery::SelectStmt:distinct_clause: [],target_list: [<PgQuery::Node:res_target: <PgQuery::ResTarget:name: "",indirection: [],val: <PgQuery::Node:a_const: <PgQuery::A_Const:ival: <PgQuery::Integer: ival: 1>,isnull: false,location: 7>>,location: 7>>],from_clause: [],group_clause: [],group_distinct: false,window_clause: [],values_lists: [],sort_clause: [],limit_option: :LIMIT_OPTION_DEFAULT,locking_clause: [],op: :SETOP_NONE,all: false>>,stmt_location: 0,stmt_len: 0>]>,@warnings=[],@tables=nil,@aliases=nil,@cte_names=nil,@functions=nil
>

修改已解析的查询并将其再次转换为 SQL

这是一个简单的例子deparse,对于更复杂的修改,请使用walk!。

parsed_query = PgQuery.parse("SELECT * FROM users")# Modify the parse tree in some way
parsed_query.tree.stmts[0].stmt.select_stmt.from_clause[0].range_var.relname = 'other_users'# Turn it into SQL again
parsed_query.deparse
=> "SELECT * FROM other_users"

解析规范化查询

# Normalizing a query (like pg_stat_statements in Postgres 10+)
PgQuery.normalize("SELECT 1 FROM x WHERE y = 'foo'")=> "SELECT $1 FROM x WHERE y = $2"

从查询中提取表

PgQuery.parse("SELECT $1 FROM x JOIN y USING (id) WHERE z = $2").tables=> ["x", "y"]

从查询中提取列

PgQuery.parse("SELECT $1 FROM x WHERE x.y = $2 AND z = $3").filter_columns=> [["x", "y"], [nil, "z"]]

指纹查询

PgQuery.parse("SELECT 1").fingerprint=> "50fde20626009aba"PgQuery.parse("SELECT 2; --- comment").fingerprint=> "50fde20626009aba"# Faster fingerprint method that is implemented inside the native C library
PgQuery.fingerprint("SELECT $1")=> "50fde20626009aba"

将查询扫描成标记

PgQuery.scan('SELECT 1 --comment')=> [<PgQuery::ScanResult: version: 160001, tokens: [
<PgQuery::ScanToken: start: 0, end: 6, token: :SELECT, keyword_kind: :RESERVED_KEYWORD>,
<PgQuery::ScanToken: start: 7, end: 8, token: :ICONST, keyword_kind: :NO_KEYWORD>,
<PgQuery::ScanToken: start: 9, end: 18, token: :SQL_COMMENT, keyword_kind: :NO_KEYWORD>]>,[]]

遍历解析树

对于通用用途,PgQuery 提供了walk!一种以递归方式处理已解析查询的方法。

这可用于创建定制的漂亮打印机:

parsed_query = PgQuery.parse "SELECT * FROM tbl"
parsed_query.walk! { |node, k, v, location| puts k }

更有用的是,这可用于重写查询。例如:

parsed_query.walk! do |node, k, v, location|next unless k.eql?(:range_var) || k.eql?(:relation)next if v.relname.nil?v.relname = "X_" + v.relname
endparsed_query.deparse

这个例子中有一些注意事项和限制。

首先,部分树节点被冻结。您可以替换它们,但无法就地修改。

其次,表重写比此示例更微妙。虽然这将重写表名,但它不会正确处理所有 CTE,也不会重写具有明确表名的列。

支持的 Ruby 版本

目前已测试并正式支持的 Ruby 版本:

  • CRuby 2.7
  • CRuby 3.0
  • CRuby 3.1
  • CRuby 3.2
  • CRuby 3.3
    不支持:
  • JRuby:pg_query依赖于 C 扩展,不鼓励使用/不支持 JRuby
  • TruffleRuby:GraalVM不支持 sigjmp,它由 Postgres 错误处理代码使用(pg_query使用
    Postgres 解析器和错误处理代码的副本)
    #PG证书#PG考试#PostgreSQL培训#PostgreSQL考试#PostgreSQL认证

原作者:卢卡斯·菲特尔
原文链接:https://github.com/pganalyze/pg_query

相关文章:

【PGCCC】 pg_query 6.0:使用 Postgres 自己的解析器解析、反解析和规范化 SQL 查询的 Ruby 库

pg_query 这个 Ruby 扩展使用实际的 PostgreSQL 服务器源来解析 SQL 查询并返回内部 PostgreSQL 解析树。 此外&#xff0c;该扩展允许您规范化查询&#xff08;用 $n 替换常量值&#xff09;并将这些规范化的查询再次解析为解析树。 当您构建此扩展时&#xff0c;它会构建 …...

18.Vue 3 + OpenLayers:实现添加全屏显示功能示例

前言 在地图应用中&#xff0c;全屏显示功能可以为用户提供更好的视觉体验和交互感受。本文将带大家实现一个基于 Vue 3 和 OpenLayers 的全屏显示地图功能&#xff0c;适合初学者或开发者快速上手。 项目准备 1. 项目搭建 如果尚未创建 Vue 3 项目&#xff0c;可以通过以下…...

04_掌握Python基础语句

学习完本篇内容,你将掌握以下技能: 掌握 Python 中的基础类型,包括整数、浮点数、布尔值、字符串等。掌握 Python 中的运算符,包括算术运算符、比较运算符、逻辑运算符、位运算符等。掌握 Python 中的语句,包括赋值语句、选择语句、循环语句等。掌握 Python 中的控制流语句…...

iOS如何自定义一个类似UITextView的本文编辑View

对于IOS涉及文本输入常用的两个View是UITextView和UITextField&#xff0c;一个用于复杂文本输入&#xff0c;一个用于简单文本输入&#xff0c;在大多数开发中涉及文本输入的场景使用这两个View能够满足需求。但是对于富文本编辑相关的开发&#xff0c;这两个View就无法满足自…...

【时时三省】(NIT计算机考试)Word的使用方法

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 一、软件简介 Microsoft Word&#xff0c;简称Word&#xff0c;是微软公司开发的一款文字处理软件&#xff0c;广泛应用于文档编辑、排版、打印等领域。无论是撰写论文、报告、简历&#xf…...

openjdk17 jvm加载class文件,解析字段和方法,C++源码展示

##构造方法ClassFileParser&#xff0c;parse_stream解析文件流 ClassFileParser::ClassFileParser(ClassFileStream* stream,Symbol* name,ClassLoaderData* loader_data,const ClassLoadInfo* cl_info,Publicity pub_level,TRAPS) :_stream(stream),_class_name(NULL),_load…...

驱动断链的研究

准备 source insight 从现在开始我们正式进入内核编程&#xff0c;但是很多内核里面的结构和类型是需要我们额外声明的&#xff0c;我们就需要一个工具来快速的阅读WIn内核源码。这里我贴出我所参考的博客 羽夏看Win系统内核——SourceInsight 配置 WRK - 寂静的羽夏 - 博客…...

在 Windows WSL 上部署 Ollama 和大语言模型:从镜像冗余问题看 Docker 最佳实践20241208

&#x1f6e0;️ 在 Windows WSL 上部署 Ollama 和大语言模型&#xff1a;从镜像冗余问题看 Docker 最佳实践 ⭐ 引言 随着大语言模型&#xff08;LLM&#xff09;和人工智能技术的迅猛发展&#xff0c;开发者们越来越多地尝试在本地环境中部署模型进行实验。 但部署过程中常…...

做题时HashSet、TreeSet、LinkedHashSet的选择

一、HashSet 此类实现 Set 接口&#xff0c;由哈希表&#xff08;实际上是一个 HashMap 实例&#xff09;支持。它不保证 set 的迭代顺序&#xff1b;特别是它不保证该顺序恒久不变。 代码&#xff1a; import java.util.HashSet; import java.util.LinkedHashSet; import ja…...

Manus手套动作捕捉AI训练灵巧手

随着人工智能&#xff08;AI&#xff09;和机器人技术的融合日益紧密&#xff0c;使用真实动作数据AI扩容训练机器人的方式正在被用于开发更富表现力的机器人。Manus手套凭借精准的动作捕捉技术和导出数据的强大兼容性&#xff0c;在灵巧手的研发和应用中发挥了重要作用。 手部…...

嵌入式驱动开发详解4(内核定时器)

文章目录 前言通用定时器系统节拍节拍数与时间转换基本框架定时器使用代码展示通用定时器特点 高精度定时器 前言 LInux内核定时器是一种基于未来时间点的计时方式&#xff0c;以当前时刻来启动的时间点&#xff0c;以未来的某一时刻为终止点。比如&#xff0c;现在是10点5分&…...

Linux:信号的预备和产生

引入&#xff1a; 比如当前快递小哥需要通知你下来取快递&#xff08;产生信号&#xff09;&#xff0c;然后通过电话或短信告知了你&#xff08;发送信号&#xff09;&#xff0c;但是当前你正在打游戏&#xff0c;所以你并不会马上去处理&#xff0c;但是你会记得这件事&…...

国城杯2024——Curve

相关知识链接&#xff1a;https://tangcuxiaojikuai.xyz/post/187210a7.html #sagemath from Crypto.Util.number import *def add(P, Q):(x1, y1) P(x2, y2) Qx3 (x1*y2 y1*x2) * inverse(1 d*x1*x2*y1*y2, p) % py3 (y1*y2 - a*x1*x2) * inverse(1 - d*x1*x2*y1*y2, p…...

AI生成不了复杂前端页面?也许有解决方案了

在2024年&#xff0c;编程成为了人工智能领域最热门的赛道。AI编程技术正以惊人的速度进步&#xff0c;但在生成前端页面方面&#xff0c;AI的能力还是饱受质疑。自从ScriptEcho平台上线以来&#xff0c;我们收到了不少用户的反馈&#xff0c;他们表示&#xff1a;“生成的页面…...

常见矩阵分析法(BCG、GE、IE、SPACE、TOWS、优先、战略优先级、安索夫、风险矩阵):如何通过系统化方法助力战略决策与数据驱动决策

在快速变化的商业环境中&#xff0c;企业决策者面临着诸多复杂的选择与挑战。矩阵分析法作为战略分析的重要工具&#xff0c;能够系统化地分析企业的内外部环境&#xff0c;帮助管理层做出更加科学、合理的决策。本文将全面解析常见的矩阵分析法&#xff0c;并探讨它们在数据驱…...

JWT 在 SaaS 系统中的作用与分布式 SaaS 系统设计的最佳实践

在现代 SaaS&#xff08;软件即服务&#xff09; 系统中&#xff0c;随着服务规模的扩大和用户需求的多样化&#xff0c;如何高效、安全地进行用户身份验证、权限控制以及租户隔离&#xff0c;成为了系统架构中的核心问题之一。**JWT&#xff08;JSON Web Token&#xff09;**作…...

基于C#和Sql Server的网上书店管理系统

基于C#和Sql Server的网上书店管理系统 摘要 本系统是建立在 Windows 平台上&#xff0c;基于 B/S 结构的一个网上书店。通过这个网上书店&#xff0c;可以实 现简单的电子商务功能。 整个网站风格一致&#xff0c;较为美观&#xff0c;有完善的导航机制。普通用户从前台首页…...

特高频局放装置在现代配电设施中的应用

引言 随着电力系统的快速发展&#xff0c;尤其是现代配电系统的不断升和智能化&#xff0c;配电网的安全、稳定和运行变得愈发重要。为了确保电力系统能够及时应对各种运行问题&#xff0c;并提高故障诊断和监控的能力&#xff0c;现代配电系统中的监测技术也不断得到创新与提…...

FSC认证是什么?FSC认证费用

FSC认证是指森林管理委员会&#xff08;Forest Stewardship Council&#xff09;颁发的一种认证&#xff0c;以下是对FSC认证的详细介绍&#xff1a; 一、FSC认证的定义与目的 FSC认证标志着一件产品来自经过环境友好、社会有益和经济可行的可持续管理的森林。FSC是一个独立的…...

JAVA数据结构

1.数组 (Array): 固定大小的容器,用于存储相同类型的元素,数组在内存中是连续存储的,支持通过索引快 速访问元素。 int[] numbers = new int[10]; numbers[0] = 1;2.Java Collections Framework (JCF) JCF提供了一组接口和类用于管理和操作集合(如列表,集合,…...

如何让foobar2000界面脱胎换骨?3大设计理念打造个性化音乐体验

如何让foobar2000界面脱胎换骨&#xff1f;3大设计理念打造个性化音乐体验 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn 副标题&#xff1a;从安装到定制&#xff1a;零基础也能掌握的foobox-cn美化…...

PHY芯片寄存器设计揭秘:从5位地址到分页扩展的演进史

PHY芯片寄存器设计演进&#xff1a;从5位地址到分页扩展的技术革命 当我们在享受千兆以太网带来的高速数据传输时&#xff0c;很少有人会想到这背后隐藏着一场持续了数十年的寄存器架构演进。PHY芯片作为网络通信的物理层核心&#xff0c;其寄存器设计经历了从简单固定到复杂可…...

comsol的单相变压器绕组及铁芯振动形变仿真模型 1、单相变压器组振动形变模型:绕组在漏磁场...

comsol的单相变压器绕组及铁芯振动形变仿真模型 1、单相变压器组振动形变模型:绕组在漏磁场的洛伦兹力作用下振动&#xff0c;在长期作用下发生位移形变 2、单相变压器铁芯振动形变模型:铁芯在磁致伸缩作用下发生振动形变 注:时域仿真可以设置观察点&#xff0c;导出随时间变化…...

鸿蒙与Android双端蓝牙开发避坑指南:定位权限、虚拟地址与厂商SDK那些事

鸿蒙与Android双端蓝牙开发实战&#xff1a;权限策略与真实地址获取全解析 当你的应用需要同时在鸿蒙和Android设备上稳定运行蓝牙功能时&#xff0c;系统差异就像一片雷区——Android 12的权限拆分、鸿蒙4.0的虚拟地址返回、不同版本间的API兼容性&#xff0c;每个环节都可能让…...

从FamNet到通用计数:小样本学习如何让AI“数”遍万物

1. 小样本计数的革命&#xff1a;从专用工具到通用能力 记得我第一次接触物体计数任务时&#xff0c;用的还是专门针对人群计数的模型。当时为了统计商场人流量&#xff0c;不得不专门训练一个模型。后来遇到统计停车场的需求&#xff0c;又要重新收集数据训练新模型。这种&quo…...

告别卡顿!用MobileNetv2+MPPTSNet-EC在树莓派上跑实时语义分割(附完整配置与性能测试)

树莓派实战&#xff1a;MobileNetv2MPPTSNet-EC实时语义分割全流程解析 当你在树莓派上第一次看到摄像头画面被实时分割成不同语义区域时&#xff0c;那种成就感绝对值得记录。本文将带你完整实现从模型选择到部署优化的全流程&#xff0c;用MobileNetv2MPPTSNet-EC这套组合拳&…...

零基础实战:揭秘Python漫画下载器高效收藏完整指南

零基础实战&#xff1a;揭秘Python漫画下载器高效收藏完整指南 【免费下载链接】copymanga-downloader 使用python编译exe/bash/命令行参数来下载copymanga(拷贝漫画)中的漫画&#xff0c;支持批量选话下载和获取您收藏的漫画并下载&#xff01;(windows&linux支持&#xf…...

stm32cubeide+freertos+c/c++混合编程实战避坑指南

1. STM32CubeIDE与FreeRTOS环境搭建避坑指南 第一次用STM32CubeIDE配置FreeRTOS时&#xff0c;我对着时钟源选项纠结了半小时。后来发现这个选择直接影响系统稳定性——选错时钟源会导致任务调度像喝醉了一样飘忽不定。实测推荐用TIM6替代默认的SysTick作为时基&#xff0c;原因…...

SP140 ESC遥测驱动库:曼彻斯特编码与单线UART嵌入式解析

1. OpenPPG_SP140_ESC 库深度解析&#xff1a;面向电动动力系统的嵌入式ESC遥测驱动开发指南1.1 项目定位与工程价值OpenPPG_SP140_ESC 是一个专为 SP140 电子调速器&#xff08;ESC&#xff09;设计的 Arduino 兼容库&#xff0c;其核心价值不在于通用电机控制&#xff0c;而在…...

虚拟内存 pagefile.sys 安全迁移教程|释放 3~8GB

摘要Windows 系统默认将虚拟内存&#xff08;pagefile.sys&#xff09;存放在 C 盘&#xff0c;长期占用 3~8GB 系统盘空间&#xff0c;不仅会加剧 C 盘爆满问题&#xff0c;还会增加磁盘读写压力&#xff0c;影响系统运行性能。本文整理 官方原生、安全无毒、无需第三方工具 的…...