gpt4 book ai didi

Django:获取 CURRENT_TIMESTAMP 的原始 sql 查询不会在后续调用中更新

转载 作者:行者123 更新时间:2023-11-29 11:45:49 26 4
gpt4 key购买 nike

我有以下代码片段用于从数据库服务器获取当前时间戳:

class DbUtils:
@staticmethod
def get_current_timestamp():
from django.db import connection
cursor = connection.cursor()
cursor.execute("SELECT CURRENT_TIMESTAMP")
rows = cursor.fetchone()
return rows[0]

为了测试这段代码,我编写了以下测试:

def test_get_current_timestamp(self):
ts_0 = DbUtils.get_current_timestamp()
time.sleep(1)
ts_1 = DbUtils.get_current_timestamp()
delta_seconds = (ts_1 - ts_0).seconds
assert 1 <= delta_seconds <= 3

这个测试没有通过,所以我深入研究了一下。原因是每次调用 DbUtils.get_current_timestamp() 每次都返回相同的值。

In [31]: DbUtils.get_current_timestamp()
Out[31]: datetime.datetime(2012, 11, 1, 17, 17, 48, 950799, tzinfo=<UTC>)

# Wait a couple seconds

In [32]: DbUtils.get_current_timestamp()
Out[32]: datetime.datetime(2012, 11, 1, 17, 17, 48, 950799, tzinfo=<UTC>)

我监控了 postgresql 日志——每个查询都在访问数据库。

我能够完成这项工作的唯一方法是导入 django.db.transaction 并在执行 SELECT 之前执行 transaction.commit_unless_managed()。在 SELECT 之前提交事务似乎不正确,因为我不知道将在什么上下文中调用 get_current_timestamp。关于如何解决这个问题或解决它的任何想法?时间戳需要来自数据库服务器,以确保正确完成所有相对时间计算。

我在运行:

Django==1.4.2
psycopg2==2.4.5 (with hstore extension via django-hstore==1.1.1)
PostgreSQL 9.1

最佳答案

在与一位同事讨论之后,我们意识到这实际上可能是理想的行为,因为我们每个网络请求只会获得一个时间戳。在任何情况下,我通常都会存储 get_current_timestamp 的返回值,并将其用于该请求期间的任何操作。

为了让我的测试通过,我需要执行以下操作:

def test_get_current_timestamp(self):
from django.db import transaction
ts_0 = DbUtils.get_current_timestamp()
transaction.commit_unless_managed()
time.sleep(1)
ts_1 = DbUtils.get_current_timestamp()
transaction.commit_unless_managed()
delta_seconds = (ts_1 - ts_0).seconds
assert 1 <= delta_seconds <= 3

正如@a_horse_with_no_name 所说:CURRENT_TIMESTAMP 是交易开始的时间。

关于Django:获取 CURRENT_TIMESTAMP 的原始 sql 查询不会在后续调用中更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13182624/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com