0

いくつかの SqlAlchemy を Django に移植しようとすると、次のトリッキーな部分があります。

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

literal_columnビットを Djangoに移植するための最良のオプションは何ですか? これまでに得た最良のアイデアは、同じ生のSQLを実行するデフォルトとして設定する関数ですが、もっと簡単な方法があるかどうかわかりませんか? 私のgoogle-fooはそこで失敗しています。

編集: mysql によって作成されたタイムスタンプを使用する必要がある理由は、何かがどれだけ古いかを測定しているため (したがって、実際に時間を知る必要があるため)、正確さのために、タイムスタンプの権限を 1 つだけ持つ必要があるためです (したがって、サーバー間で異なる可能性があるシステム時間を調べる 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 に答える