ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Neon proxy 的 SQL over HTTP 服务怎么本地启动并发送带参数的查询

Neon proxy 的 SQL over HTTP 服务怎么本地启动并发送带参数的查询 Neon proxy 的 SQL over HTTP 服务怎么本地启动并发送带参数的查询【免费下载链接】neonNeon: Serverless Postgres. We separated storage and compute to offer autoscaling, code-like database branching, and scale to zero.项目地址: https://gitcode.com/GitHub_Trending/ne/neonNeon proxy 除了 TCP/WS 的 Postgres 协议外还提供一个 SQL over HTTP 服务接收POST请求中的 SQL 文本返回 JSON 序列化结果。这个端点不需要驱动一次 HTTP 请求即可完成查询也可以直接带参数$1、$2占位符 params数组发送。本文按 proxy/README.md 的说明在本地搭一个 Postgres、启动 proxy 的 SQL over HTTP 监听并用curl发送一条带参数的查询验证返回的 JSON 结果。适用前提本地已安装 Docker、Rust 工具链和opensslproxy 的postgresauth backend 用于本地测试README 原文useful for local testing它会从指定数据库里查角色认证信息本地*.local.neon.build域名解析到127.0.0.1因为/etc/hosts不支持通配域名README 用这个域名来模拟按子域名选择项目的行为。准备本地 Postgres 和认证表proxy 的postgresauth backend 需要一个 Postgres 实例存放认证元数据。README 给出的最短路径是 Dockerdocker run \ --detach \ --name proxy-postgres \ --env POSTGRES_PASSWORDproxy-postgres \ --publish 5432:5432 \ postgres:17-bookworm然后在容器里创建认证 schema、endpoints 表和 proxy 将使用的角色docker exec -it proxy-postgres psql -U postgres -c CREATE SCHEMA IF NOT EXISTS neon_control_plane docker exec -it proxy-postgres psql -U postgres -c CREATE TABLE neon_control_plane.endpoints (endpoint_id VARCHAR(255) PRIMARY KEY, allowed_ips VARCHAR(255)) docker exec -it proxy-postgres psql -U postgres -c CREATE ROLE proxy WITH SUPERUSER LOGIN PASSWORD password;其中proxy角色就是稍后查询里Neon-Connection-String要连的角色。可选分支只有要测试查询取消query cancellation时才需要 Redis本文的查询验证不涉及docker run --detach --name proxy-redis --publish 6379:6379 redis:7.0生成自签名证书proxy 的 HTTP/WSS 监听走 TLS本地测试用自签名证书即可openssl req -new -x509 -days 365 -nodes -text -out server.crt -keyout server.key -subj /CN*.local.neon.build证书 CN 必须是*.local.neon.build这样proxy.local.neon.build、endpoint.local.neon.build等主机名都能匹配。启动 proxy 并打开 SQL over HTTP 监听在仓库根目录用testingfeature 编译并运行 proxyRUST_LOGproxy LOGFMTtext cargo run -p proxy --bin proxy --features testing -- \ --auth-backend postgres --auth-endpoint postgresql://postgres:proxy-postgres127.0.0.1:5432/postgres \ --wss 0.0.0.0:4444 \ -c server.crt -k server.key参数说明均按 README 原文--auth-backend postgres使用本地 Postgres 做认证适合本地测试--auth-endpointproxy 用来查询角色认证信息的连接串指向上面启动的proxy-postgres--wss 0.0.0.0:4444SQL over HTTP 的入口。该参数名为wss但 proxy/src/binary/proxy.rs 中的注释明确说明这个 serverless 监听器现在覆盖的不仅是 WebSocket还包括 SQL over HTTP即POST /sql请求就发在这个端口上-c / -k上面的自签名证书和私钥。如果想跳过编译、直接用已构建的二进制README 的 SQL over HTTP 一节给出的等价形式是LOGFMTtext ./target/debug/proxy -c server.crt -k server.key --auth-backendpostgres --auth-endpointpostgres://stas127.0.0.1:5432/stas --wss 0.0.0.0:4444示例中stas是 README 作者本机库名按你自己准备的角色和库替换。如果同时启动了 Redis 想测查询取消README 的命令里还会加--redis-auth-typeplain --redis-plainredis://127.0.0.1:6379。发送带参数的查询proxy 和 Postgres 都起来后向4444端口的/sql路径发POST请求。请求体是 JSONquery为 SQL 文本params为按$1、$2顺序排列的参数数组参数值可以是字符串如 Postgres 数组字面量{{1,2},{3,4}}也可以是 JSON 对象curl -k -X POST https://proxy.local.neon.build:4444/sql \ -H Neon-Connection-String: postgres://proxy:passwordproxy.local.neon.build:4444/postgres \ -H Content-Type: application/json \ --data { query:SELECT $1::int[] as arr, $2::jsonb as obj, 42 as num, params:[ {{1,2},{\3\,4}}, {key:val, ikey:4242}] } | jq说明-k是因为用的是自签名证书跳过 TLS 校验Neon-Connection-String头指定本次查询要连接的角色和库这里用的是上面创建的proxy角色README 的原始示例使用postgres://stas:pass...按你实际创建的角色替换即可连接串中的主机名用*.local.neon.buildproxy 会按子域名做路由。README 给出的文档示例响应如下这是文档中的示例输出字段结构以此为准{ command: SELECT, fields: [ { dataTypeID: 1007, name: arr }, { dataTypeID: 3802, name: obj }, { dataTypeID: 23, name: num } ], rowCount: 1, rows: [ { arr: [[1,2],[3,4]], num: 42, obj: { ikey: 4242, key: val } } ] }收到这样一条包含command、fields、rowCount、rows的 JSON且rows内容与参数绑定一致说明 SQL over HTTP 链路已经通了。可选调整输出格式的两个请求头请求时可以附加两个可选头来改变返回 JSON 的结构README “Output options”一节Neon-Raw-Text-Output: truePostgres 值不解析、直接按文本返回。数字、对象、布尔、null 和数组都会以字符串形式给出适合客户端自己实现解析或复用 node-postgres 的解析库。Neon-Array-Mode: true行以数组而不是对象返回。这种表示更紧凑也适用于几个字段同名的场景。例如给上面的 curl 加一行-H Neon-Array-Mode: truerows就从对象变成按列顺序排列的数组。结果判断与限制成功的判断方式/sql返回上述结构的 JSON。另外可以用 psql 验证 proxy 的 TCP 侧也正常README 的本地测试命令PGSSLROOTCERT./server.crt psql postgresql://proxy:passwordendpoint.local.neon.build:4432/postgres?sslmodeverify-full请求走的是扩展查询协议proxy 内部使用扩展查询协议、以文本协议单轮次发送查询这也是 SQL 注入防护的一部分同时因为并非所有 Postgres 类型都有二进制表示如pg_class里的 acl返回统一走文本协议。类型转换规则README 列出的主要转换int2 / int4 / float4 / float8 → JSON 数字NaN 和 Inf 仍为文本bool、null、text → JSON 布尔、null、字符串数组 → JSON 数组json / jsonb → JSON 对象。 其余类型按字符串传回。响应结构与 node-postgres 对齐返回 command tag 和列 oidfields里的dataTypeID便于和 JS 侧库集成。域名路由proxy 从子域名推断项目名如round-rice-566201.somedomain.tld→ 项目round-rice-566201本地靠*.local.neon.build → 127.0.0.1模拟如果请求打不到127.0.0.1或端口不对先检查域名解析和--wss端口是否为4444。认证方式本文路径使用postgresauth backend本地测试用途console、web等 backend 是生产路由方式不在本场景范围内。到这里本地 SQL over HTTP 的最小闭环就完成了Docker 起认证库 → 自签名证书 →cargo run带--wss 0.0.0.0:4444启动 →curl POST /sql带参数查询 → 核对 JSON 返回。更多参数和 auth broker 的接法可以继续看 proxy/README.md。【免费下载链接】neonNeon: Serverless Postgres. We separated storage and compute to offer autoscaling, code-like database branching, and scale to zero.项目地址: https://gitcode.com/GitHub_Trending/ne/neon创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表