Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.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
Django,访问PostgreSQL序列_Django_Postgresql_Django Models - Fatal编程技术网

Django,访问PostgreSQL序列

Django,访问PostgreSQL序列,django,postgresql,django-models,Django,Postgresql,Django Models,在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

在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。我不知道问题出在哪里。

我能想出的最好的解决办法是:如果你的订单号很少,不要担心。如果订单号丢失,这应该无关紧要:没有办法确保订单号是连续的,在某一点上不受竞争条件的约束

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


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

我认为我们需要从您的视图代码中看到更多内容。基本上,视图代码中没有更多内容。但无论如何,我已经改变了如何生成订单号的想法。我需要生成唯一的订单号,以便在必要时能够跟踪订单。我尝试的方式有一个严重的缺点。我必须每天午夜整点重新设置计数器。不管怎样,谢谢你们的回复。看来错误出现在应用程序的另一部分,所以问题解决了。我在某个地方读到了一些关于生成订单号的信息:这里有一些非常有用的提示。