sqlalchemy クエリ呼び出しを抽象化しようとしていますが、変更されていない完全な呼び出しは次のようになります。
Session.query(User).options(FromCache('redis1')).filter(User.id == user_id).all()
私が制御する必要がある動的部分は、 User、redis1、および最後の呼び出しall() です。上記の行のようなものを呼び出して、上記の引数の太字のものを変更する可能性があります。
私の最初の試みは次のようになりました:
# Abstracts the final chained method
def q(obj, action):
return getattr(obj, action)()
# Removes a lot of boiler plate code
# but doesn't give me control over the cache argument
# which I need in the same method as the action above
def query(model):
return Session.query(model).options(FromCache('redis1'))
# Called like this
result = q(query(User).filter(User.id == user_id), 'all')
しかし、アクションとモデルの両方を制御できるように、関数を 2 つではなく 1 つだけにしたいのは明らかです。この理由は、クエリが失敗した場合に FromCache オプションで異なるキャッシュ サーバーを通過する try-except ブロックで.one()または.all()呼び出しをラップしたいからです。しかし、クエリを書くたびにこれを行うのは面倒です。
私はこのようなものを探しています(コードは明らかに機能しません):
def q(model, filters, action):
data = None
servers = ['redis1', 'redis2']
for server in servers:
try:
call = Session.query(model).options(FromCache(redis)).filters_here_somehow()
data = getattr(call, obj)() # Final call from action added
except:
continue
break;
return data
# and called something like this.. (or some other way)
result = q(User, the filter/between/limit/whatnot here, 'all')
アイデアはありますか、それとも私は完全にベースから外れていますか? または、これを行うためのよりスマートな方法はありますか?