这个 Python 查询怎么可能在两个不同的结果之间交替?
How is it possible for this Python query to alternate between two different results?
我正在执行以下代码,
import psycopg2
import pandas as pd
@contextmanager
def get_psyopg2_connection(server='my_server', port=1234, read_only=True):
try:
conn = psycopg2.connect("<connection_string>")
conn.set_session(readonly=read_only, autocommit=True)
yield conn
except Exception as e:
raise Exception(e) from e
finally:
conn.close()
if __name__=="__main__":
with get_psyopg2_connection() as conn_dev:
df = pd.read_sql("""select last_value from public.lime_boxes_id_seq""", conn_dev)
print(df)
我收到了两个不同的结果; last_value = 6(正确)和 33(错误)。当我多次 运行 相同的代码时,我可能会得到像 6, 6, 6, 33, 33, 6 这样的结果序列。它是 unpredictable.
当我在 DBeaver 中执行这个查询时,我总是得到 6。
怎么会这样?
编辑:
这个 table 是一个序列,除了我自己,没有人访问这个模式。内容在这里
last_value
log_cnt
is_called
6
27
true
有 3 种不同的可能性对我来说很突出:
public.lime_boxes_id_seq
中有多条记录,由于你没有指定ORDER BY
子句,数据库不会保证返回记录的顺序。虽然这绝对是一种低可能性,但仍然值得探索 table 被查询 实际上 包含哪些数据并从那里开始工作。
有问题的数据库服务器(my_server
)实际上是它后面的一组 Postgres 节点的某种负载平衡器,并且有一个或多个节点与其余部分不同步并返回 old/incorrect 数据。 这将完全解释您的 DBeaver 客户端每次获得相同结果的原因(可能不是 connecting/disconnecting/reconnecting 在查询之间,每次都可能连接到不同的服务器,并且可能在查询之间保持相同的连接),但您的代码(每次执行 connects/disconnects/reconnects )不会。为了缓解这种情况,您可以连接到集群中已知良好的节点(如果您的网络设置允许这样的安排),或者修复导致数据陈旧的复制问题。
如果所讨论的值曾经是 33,则可能 在您的代码和 Postgres 中的 table 之间的网络中存在某种缓存机制正在返回此错误数据。 如果它被此 appliance/these 设备缓存并且此后未被刷新,这也可能是此数据未返回您认为的内容的原因应该,缓存 flush/reconfiguration 是必要的。
我正在执行以下代码,
import psycopg2
import pandas as pd
@contextmanager
def get_psyopg2_connection(server='my_server', port=1234, read_only=True):
try:
conn = psycopg2.connect("<connection_string>")
conn.set_session(readonly=read_only, autocommit=True)
yield conn
except Exception as e:
raise Exception(e) from e
finally:
conn.close()
if __name__=="__main__":
with get_psyopg2_connection() as conn_dev:
df = pd.read_sql("""select last_value from public.lime_boxes_id_seq""", conn_dev)
print(df)
我收到了两个不同的结果; last_value = 6(正确)和 33(错误)。当我多次 运行 相同的代码时,我可能会得到像 6, 6, 6, 33, 33, 6 这样的结果序列。它是 unpredictable.
当我在 DBeaver 中执行这个查询时,我总是得到 6。
怎么会这样?
编辑:
这个 table 是一个序列,除了我自己,没有人访问这个模式。内容在这里
last_value | log_cnt | is_called |
---|---|---|
6 | 27 | true |
有 3 种不同的可能性对我来说很突出:
public.lime_boxes_id_seq
中有多条记录,由于你没有指定ORDER BY
子句,数据库不会保证返回记录的顺序。虽然这绝对是一种低可能性,但仍然值得探索 table 被查询 实际上 包含哪些数据并从那里开始工作。有问题的数据库服务器(
my_server
)实际上是它后面的一组 Postgres 节点的某种负载平衡器,并且有一个或多个节点与其余部分不同步并返回 old/incorrect 数据。 这将完全解释您的 DBeaver 客户端每次获得相同结果的原因(可能不是 connecting/disconnecting/reconnecting 在查询之间,每次都可能连接到不同的服务器,并且可能在查询之间保持相同的连接),但您的代码(每次执行 connects/disconnects/reconnects )不会。为了缓解这种情况,您可以连接到集群中已知良好的节点(如果您的网络设置允许这样的安排),或者修复导致数据陈旧的复制问题。如果所讨论的值曾经是 33,则可能 在您的代码和 Postgres 中的 table 之间的网络中存在某种缓存机制正在返回此错误数据。 如果它被此 appliance/these 设备缓存并且此后未被刷新,这也可能是此数据未返回您认为的内容的原因应该,缓存 flush/reconfiguration 是必要的。