61 lines
1.8 KiB
Python
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)
|