如何在 Postgres 查询中定义变量并保持值?

How to define a variable in Postgres query and hold value?

我有一个 Postgres 数据库和下面的示例 table。

我有一个函数 运行s 一段时间,每次 运行s,select 查询一些行并将其发送到 Azure 服务总线。 我想在查询中定义一个变量并保存最后一个值,如“id”。下次取运行select数据从上次取值

例如:

第一个 运行:select 行 ID 为“1”和“2”

第二个 运行:select 行 ID 为“3”和“4”

我的代码是:

import os
import psycopg2
import pandas as pd
from azure.servicebus import ServiceBusClient, ServiceBusMessage


conndb = psycopg2.connect(
    database="testDB", user="postgres", password="***", host="127.0.0.1", port="5432"
)
connstr = "****"
queue_name = '****'


data = pd.read_sql_query('''SELECT * FROM cricketers
                         ORDER BY id
                         OFFSET 0 ROWS
                         FETCH FIRST 2 ROW ONLY''', conndb)
data_send = data.to_string()

with ServiceBusClient.from_connection_string(connstr) as client:
    with client.get_queue_sender(queue_name) as sender:
        single_message = ServiceBusMessage(data_send)
        sender.send_messages(single_message)

我正在考虑在 OFFSET variable ROWS

上使用变量

还有其他解决方案吗?

一种方法是使用 sequence :

create sequence cricketersSeq
as int 
increment by 2 
minvalue 0
owned by cricketers.id

owned by 只是将序列与 table 相关联,与它的序列无关。序列由 setval() 和 nextval()

设置或增加

并将您的查询更改为:

select *
from cricketers
order by id 
offset nextval('cricketersSeq') rows 
fetch first 2 row only

请注意,序列跟踪的是行号而不是 ID column.and,因为您使用了偏移获取,我想这就是您想要的。

但您可以调整顺序以跟踪 ID 而不是行号:

create sequence cricketersSeq
as int 
minvalue 0
owned by cricketers.id

您的查询将是这样的:

select setval('cricketersSeq',id) , * 
from cricketers
where id >(select last_value from cricketersSeq)
order by id 
limit 2;