sync_game_data/update_data/update_data.py
2020-09-12 18:03:05 +08:00

61 lines
1.8 KiB
Python

import abc
import time
import aiomysql
from loguru import logger
from config import settings
class LoadData(metaclass=abc.ABCMeta):
def __init__(self, *args, **kwargs):
self.gm_db_pool = kwargs.get('gm_db_pool')
self.gm_key = None
self.act_time = None
self.last_act_time = None
async def get_kv(self, key, try_count=3):
try:
sql = 'select v from gm_kv where k=%s'
ts = int(time.time())
async with self.gm_db_pool.acquire() as conn:
async with conn.cursor(aiomysql.DictCursor) as cur:
await cur.execute(sql, (settings.KV_PREFIX + key,))
res = (await cur.fetchone()) or {}
v = int(res.get('v') or ts)
self.last_act_time = v
if not res:
await self.set_kv(key, ts)
return v
except Exception as e:
if try_count > 0:
logger.warning(f'连接gm mysql失败 剩余次数{try_count - 1}')
return await self.get_kv(key, try_count - 1)
else:
raise e
async def set_kv(self, key, value):
key = settings.KV_PREFIX + key
sql = 'replace into gm_kv set k=%s,v=%s'
async with self.gm_db_pool.acquire() as conn:
async with conn.cursor() as cur:
await cur.execute(sql, (key, value))
await conn.commit()
@abc.abstractmethod
async def get_data(self):
pass
@abc.abstractmethod
async def update_data(self, data):
pass
async def run(self):
ts = int(time.time())
self.act_time = ts
data = await self.get_data()
await self.update_data(data)
if self.gm_key:
await self.set_kv(self.gm_key, self.act_time)