qotnews/apiserver/database.py

105 lines
2.5 KiB
Python
Raw Normal View History

2020-06-25 23:41:15 +00:00
import json
2020-06-26 00:21:03 +00:00
from sqlalchemy import create_engine, Column, String, ForeignKey, Integer
2020-06-25 23:41:15 +00:00
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
2020-06-26 21:28:39 +00:00
from sqlalchemy.exc import IntegrityError
2020-06-25 23:41:15 +00:00
engine = create_engine('sqlite:///data/qotnews.sqlite')
Session = sessionmaker(bind=engine)
Base = declarative_base()
class Story(Base):
__tablename__ = 'stories'
2020-06-26 00:21:03 +00:00
sid = Column(String(16), primary_key=True)
2020-06-25 23:41:15 +00:00
meta_json = Column(String)
full_json = Column(String)
2020-06-26 21:28:39 +00:00
title = Column(String)
date = Column(Integer)
2020-06-25 23:41:15 +00:00
2020-06-26 00:21:03 +00:00
class Reflist(Base):
__tablename__ = 'reflist'
rid = Column(Integer, primary_key=True)
ref = Column(String(16), unique=True)
sid = Column(String, ForeignKey('stories.sid'), unique=True)
2020-06-25 23:41:15 +00:00
def init():
Base.metadata.create_all(engine)
2020-06-26 21:28:39 +00:00
def get_story(sid):
2020-06-25 23:41:15 +00:00
session = Session()
2020-06-26 21:28:39 +00:00
return session.query(Story).get(sid)
2020-06-25 23:41:15 +00:00
2020-06-26 00:21:03 +00:00
def put_story(story):
2020-06-25 23:41:15 +00:00
full_json = json.dumps(story)
2020-06-26 21:28:39 +00:00
story.pop('text', None)
story.pop('comments', None)
2020-06-25 23:41:15 +00:00
meta_json = json.dumps(story)
try:
session = Session()
2020-06-26 21:28:39 +00:00
s = Story(
sid=story['id'],
full_json=full_json,
meta_json=meta_json,
title=story.get('title', None),
date=story.get('date', None),
)
2020-06-25 23:41:15 +00:00
session.merge(s)
session.commit()
except:
session.rollback()
raise
finally:
session.close()
2020-06-26 00:21:03 +00:00
2020-06-26 21:28:39 +00:00
def search(q):
session = Session()
return session.query(Story).filter(Story.title.contains(q))
2020-06-26 00:21:03 +00:00
def get_reflist(amount):
session = Session()
q = session.query(Reflist).order_by(Reflist.rid.desc()).limit(amount)
return [dict(ref=x.ref, sid=x.sid) for x in q.all()]
2020-06-26 21:28:39 +00:00
def get_stories(amount):
session = Session()
q = session.query(Reflist, Story.meta_json).\
order_by(Reflist.rid.desc()).\
join(Story).\
filter(Story.title != None).\
limit(amount)
return [x[1] for x in q]
2020-06-26 00:21:03 +00:00
def put_ref(ref, sid):
try:
session = Session()
r = Reflist(ref=ref, sid=sid)
session.add(r)
session.commit()
except:
session.rollback()
raise
finally:
session.close()
2020-06-26 21:28:39 +00:00
def del_ref(ref):
try:
session = Session()
session.query(Reflist).filter(Reflist.ref==ref).delete()
session.commit()
except:
session.rollback()
raise
finally:
session.close()
2020-06-26 00:21:03 +00:00
if __name__ == '__main__':
init()
2020-06-26 21:28:39 +00:00
print(get_stories(5))