0

尝试将一些 SqlAlchemy 移植到 Django,但我遇到了这个棘手的问题:

version = Column(
     BIGINT,
     default=literal_column(
         'UNIX_TIMESTAMP() * 1000000 + MICROSECOND(CURRENT_TIMESTAMP)'
     ),
     nullable=False)

literal_column将位移植到 Django的最佳选择是什么?到目前为止,我最好的想法是一个函数设置为执行相同原始 sql 的默认值,但我不确定是否有更简单的方法?我的 google-foo 在那里让我失望了。

编辑:我们需要使用 mysql 创建的时间戳的原因是我们正在测量某些东西的过时程度(所以我们需要实际知道时间)并且为了正确性,我们希望只有一个时间戳权限(所以我们不会使用查看系统时间的 python 函数引入错误,这可能因服务器而异)。

目前我有:

def get_current_timestamp(self):
    cursor = connection.cursor()
    cursor.execute("SELECT UNIX_TIMESTAMP() * 1000000 + MICROSECOND(CURRENT_TIMESTAMP)")
    row = cursor.fetchone()
    return row

version = models.BigIntegerField(default=get_current_timestamp)

在这一点上,这听起来像是我最好/唯一的选择。

4

1 回答 1

1

如果您不关心拥有中央时间权限:

import time

version = models.BigIntegerField(
    default = lambda: int(time.time()*1000000) )

根据您的意愿弯曲数据库:

from django.db.models.expressions import ExpressionNode

class NowInt(ExpressionNode):
    """ Pass this in the same manner you would pass Count or F objects """

    def __init__(self):
        super(Now, self).__init__(None, None, False)

    def evaluate(self, evaluator, qn, connection):
        return '(UNIX_TIMESTAMP() * 1000000 + MICROSECOND(CURRENT_TIMESTAMP))', []

### Model

version = models.BigIntegerField(default=NowInt())

因为表达式节点不是可调用的,所以表达式将在数据库端进行评估。

于 2013-03-28T11:29:32.817 回答