Hen*_*nri 6 django postgresql django-models
在 Django 应用程序中,我需要创建一个订单号,如下所示:yyyymmddnnnn,其中 yyyy=年,mm=月,dd=日,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 会话,并且数字会很好地增加,并且不同会话中不会出现相同的数字。
现在我尝试从视图中调用此函数,如下所示:
import get_order_number
order_number = get_order_number.get_new_order_number()
它给了我一个数字。然而,下次我访问该视图时,它会将数字增加 2。我不知道问题出在哪里。
我能想到的最佳解决方案是:如果您的订单号很少,请不要担心。如果缺少订单号也没关系:无法确保订单号是连续的,并且在某些时候不会受到竞争条件的影响。
您最大的问题可能是让那些尖头发的人相信“丢失”订单号不是问题。
有关更多详细信息,请参阅SQL Antipatterns中的 Psuedo-Key Neat Freak 条目。(请注意,这是一本书的链接,该书的全文不可免费获得)。
| 归档时间: | 
 | 
| 查看次数: | 10685 次 | 
| 最近记录: |