【问题标题】:Django, accessing PostgreSQL sequenceDjango,访问 PostgreSQL 序列
【发布时间】:2011-03-23 17:37:32
【问题描述】:

在 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'

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

现在我尝试从如下视图中调用这个函数:

import get_order_number

order_number = get_order_number.get_new_order_number()

它给了我一个数字。但是下次访问视图时,它会将数字增加 2。我不知道问题出在哪里。

【问题讨论】:

  • 我认为我们需要从你的视图代码中看到更多。
  • 视图代码中基本上没有更多内容了。但无论如何,我已经改变了如何生成订单号的想法。我需要生成唯一的订单号,以便在必要时能够跟踪订单。我尝试的方式有一个严重的缺点。我必须每天午夜时分重置计数器。无论如何,谢谢你们的回复。
  • 似乎错误出现在应用程序的另一部分,因此问题已解决。在某处我读到了一些关于生成订单号的内容:stackoverflow.com/questions/1179439/…,这里有一些非常有用的提示。

标签: django postgresql django-models


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    看看这个问题/答案Custom auto-increment field in postgresql (Invoice/Order No.)

    您可以使用 RawSql 迁移创建存储过程。

    【讨论】:

      猜你喜欢
      • 2011-03-11
      • 2015-08-08
      • 2018-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      • 2019-04-27
      • 1970-01-01
      相关资源
      最近更新 更多