Archived
1
0
Fork 0
This repository has been archived on 2024-04-26. You can view files and clone it, but cannot push or open issues or pull requests.
akari-bot/database/local.py
2023-12-19 14:35:50 +08:00

71 lines
2 KiB
Python

import datetime
import ujson as json
from sqlalchemy import create_engine, Column, Text, TIMESTAMP, text
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from tenacity import retry, stop_after_attempt
Base = declarative_base()
DB_LINK = 'sqlite:///database/local.db'
class DirtyFilterTable(Base):
__tablename__ = "filter_cache"
desc = Column(Text, primary_key=True)
result = Column(Text)
timestamp = Column(TIMESTAMP, default=text('CURRENT_TIMESTAMP'))
class LocalDBSession:
def __init__(self):
self.engine = engine = create_engine(DB_LINK)
Base.metadata.create_all(bind=engine, checkfirst=True)
self.Session = sessionmaker()
self.Session.configure(bind=self.engine)
@property
def session(self):
return self.Session()
session = LocalDBSession().session
def auto_rollback_error(func):
def wrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except Exception as e:
session.rollback()
raise e
return wrapper
class DirtyWordCache:
@retry(stop=stop_after_attempt(3))
@auto_rollback_error
def __init__(self, query_word):
self.query_word = query_word
self.query = session.query(DirtyFilterTable).filter_by(desc=self.query_word).first()
self.need_insert = False
if not self.query:
self.need_insert = True
if self.query is not None and datetime.datetime.now().timestamp() - self.query.timestamp.timestamp() > 86400:
session.delete(self.query)
session.commit()
self.need_insert = True
@retry(stop=stop_after_attempt(3))
@auto_rollback_error
def update(self, result: dict):
session.add_all([DirtyFilterTable(desc=self.query_word, result=json.dumps(result))])
session.commit()
def get(self):
if not self.need_insert:
return json.loads(self.query.result)
else:
return False