1

予定された支払いと過去の支払いのテーブルがあり、同じユーザー/契約に対して同じ週に 2 つの請求があるかどうかを確認する必要があります。

select count(*) from charge as c1, charge as c2 
where c1.id_contract = c2.id_contract 
  and c1.status = 'SUCCESS' 
  and c2.status in ('SUCCESS', 'PENDING', 'WAITING') 
  and c1.id > c2.id and c2.due_time > (c1.due_time - interval 7 day);

このクエリを sqlalchemy で再現するのに苦労しています。これは主に、MySQL の「間隔」をデータベースに依存しない形式で SQLAlchemy に変換する方法が見つからないためです。

これまでのところ、すべてを翻訳するこれを思いつきましたが、間隔は次のとおりです。

db.session.query(Charge, OldCharge).filter(Charge.id_contract == OldCharge.id_contract, Charge.status=='WAITING', OldCharge.status.in_(('SUCCESS', 'PENDING')), Charge.id > OldCharge.id).count()

何か案は?

4

2 に答える 2

4

これが s (デフォルトの間隔)に対してのみ必要な場合はDAY、SQL を次のように言い換えるだけです。

c2.due_time > ADDDATE(c1.due_time, - 7)

SA 用語で次のように記述できます。

filter(Charge.due_time > func.ADDDATE(OldCharge.due_time, -7))

さまざまな間隔の種類 (週、月、年) でフィルター処理する必要がある場合は、おそらくカスタム SQL コンストラクト コンパイラを作成する必要があります (詳細については、カスタム SQL コンストラクトとコンパイル拡張機能を参照してください)。

于 2012-09-22T12:34:15.993 に答える
4

そのため、カスタムの date_diff() 式を作成することになりました。

class date_diff(expression.FunctionElement):
    type = Integer()
    name = 'age'

@compiles(date_diff, 'default')
def _default_date_diff(element, compiler, **kw):  # pragma: no cover
    return "DATEDIFF(%s, %s)" % (compiler.process(element.clauses.clauses[0]),
                                 compiler.process(element.clauses.clauses[1]),
                                 )
@compiles(date_diff, 'mysql')
def _my_date_diff(element, compiler, **kw):  # pragma: no cover
    return "DATEDIFF(%s, %s)" % (compiler.process(element.clauses.clauses[0]),
                                 compiler.process(element.clauses.clauses[1]),
                                 )

@compiles(date_diff, 'sqlite')
def _sl_date_diff(element, compiler, **kw):    # pragma: no cover
    return "julianday(%s) - julianday(%s)" % (compiler.process(element.clauses.clauses[0]),
                                              compiler.process(element.clauses.clauses[1]),
                                              )
于 2012-11-26T14:09:11.477 に答える