如何在 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;
我有一个 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;