gpt4 book ai didi

Django,访问 PostgreSQL 序列

转载 作者:行者123 更新时间:2023-11-29 11:34:44 25 4
gpt4 key购买 nike

在 Django 应用程序中,我需要创建一个订单号,如下所示:yyyymmddnnnn,其中 yyyy=year,mm=month,dd=day,nnnn 是 1 到 9999 之间的数字。

我想我可以使用 PostgreSQL 序列,因为生成的数字是原子的,所以我可以确定当进程获得一个数字时,该数字是唯一的。

所以我创建了一个 PostgreSQL 序列:

CREATE SEQUENCE order_number_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9999
START 1
CACHE 1
CYCLE;

这个序列可以作为一个只有一行的表来访问。所以在文件 checkout.py 中我创建了一个 Django 模型来访问这个序列。

class OrderNumberSeq(models.Model):
"""
This class maps to OrderNumberSeq which is a PostgreSQL sequence.
This sequence runs from 1 to 9999 after which it restarts (cycles) at 1.
A sequence is basically a special single row table.
"""
sequence_name = models.CharField(max_length=128, primary_key=True)
last_value = models.IntegerField()
increment_by = models.IntegerField()
max_value = models.IntegerField()
min_value = models.IntegerField()
cache_value = models.IntegerField()
log_cnt = models.IntegerField()
is_cycled = models.BooleanField()
is_called = models.BooleanField()

class Meta:
db_table = u'order_number_seq'

我将 sequence_name 设置为主键,因为 Django 坚持在表中有一个主键。

我创建了一个包含以下内容的文件 get_order_number.py:

def get_new_order_number():
order_number = OrderNumberSeq.objects.raw("select sequence_name, nextval('order_number_seq') from order_number_seq")[0]

today = datetime.date.today()
year = u'%4s' % today.year
month = u'%02i' % today.month
day = u'%02i' % today.day

new_number = u'%04i' % order_number.nextval
return year+month+day+new_number

现在,当我从 django 交互式 shell 调用“get_new_order_number()”时,它的行为符合预期。

>>> checkout.order_number.get_new_order_number()
u'201007310047'
>>> checkout.order_number.get_new_order_number()
u'201007310048'
>>> checkout.order_number.get_new_order_number()
u'201007310049'

每次调用该函数时,您都会看到数字递增 1。您可以启动多个交互式 django session ,数字会很好地递增,不同 session 中不会出现相同的数字。

现在我尝试使用如下 View 调用此函数:

import get_order_number

order_number = get_order_number.get_new_order_number()

它给了我一个数字。然而,下次我访问该 View 时,它会将数字递增 2。我不知道问题出在哪里。

最佳答案

我能想到的最佳解决方案是:如果您的订单号很少,请不要担心。订单号丢失应该无关紧要:没有办法确保订单号是连续的,在某些时候不会出现竞争条件。

您最大的问题可能是让那些尖头的人相信“缺少”订单号不是问题。

有关更多详细信息,请参阅 SQL Antipatterns 中的 Psuedo-Key Neat Freak 条目. (请注意,这是一本书的链接,该书的全文不能免费获得)。

关于Django,访问 PostgreSQL 序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3379891/

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