Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Postgres查询和保留值中定义变量?_Python_Pandas_Postgresql_Azureservicebus_Azure Servicebus Queues - Fatal编程技术网

Python 如何在Postgres查询和保留值中定义变量?

Python 如何在Postgres查询和保留值中定义变量?,python,pandas,postgresql,azureservicebus,azure-servicebus-queues,Python,Pandas,Postgresql,Azureservicebus,Azure Servicebus Queues,我有一个Postgres数据库,我有下面的示例表 我有一个运行一段时间的函数,每次运行时,用query选择一些行并将其发送到Azure服务总线。 我想在查询中定义一个变量,并保存最后一个值,如“id”。下次运行时,从上一个值中选择数据 例如: 第一次运行:选择id为“1”和“2”的行 第二次运行:选择id为“3”和“4”的行 我的代码是: import os import psycopg2 import pandas as pd from azure.servicebus import Ser

我有一个Postgres数据库,我有下面的示例表

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

例如:

第一次运行:选择id为“1”和“2”的行

第二次运行:选择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变量行上使用一个变量


还有其他解决方案吗?

一种方法是使用序列:

create seq
as int
增加2
最小值0
由板球运动员拥有
属于的
只将序列和表关联,和表的序列无关。序列由setval()和nextval()设置或增加

并将查询更改为:

select *
from cricketers
order by id 
offset nextval('cricketersSeq') rows 
fetch first 2 row only
请注意,该序列跟踪的是行号,而不是id列。由于您使用了偏移量获取,我假设这就是您想要的

但您可以调整序列以跟踪id而不是行号:

create seq
as int
最小值0
由板球运动员拥有
您的查询将如下所示:

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

我希望跟踪在查询中获取的最后一行。下次我将在那一排之后开始。例如,第一个查询从0到100开始,下一次查询从101到200。@Shadi然后签出第二个解决方案。