from contextlib import contextmanager from flask import current_app from sqlalchemy import create_engine, Column, Integer, String, DateTime, Text, Index, ForeignKey from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker, relation, backref from sqlalchemy.orm.exc import NoResultFound engine = create_engine(current_app.config['DB_PATH']) Base = declarative_base(bind = engine) class Paste(Base): __tablename__ = 'paste' id = Column(Integer, primary_key = True) hash = Column(String, unique = True, index = True) nick = Column(String) date = Column(DateTime, nullable = False) syntax = Column(String) title = Column(String) text = Column(Text, nullable = False) ip = Column(String) def __init__(self, hash, nick, date, syntax, title, text, ip=None): self.nick = nick self.hash = hash self.date = date self.syntax = syntax self.title = title self.text = text self.ip = ip def __repr__(self): return '' % (self.id, self.hash, self.nick, self.date.ctime(), self.title) class Cache(Base): __tablename__ = 'cache' id = Column(Integer, primary_key = True) paste_hash = Column(String, ForeignKey('paste.hash'), index = True) paste = relation(Paste, primaryjoin = paste_hash == Paste.hash, lazy = False) syntax_name = Column(String) text = Column(Text, nullable = False) def __init__(self, hash, syntax_name, text): self.paste_hash = hash self.syntax_name = syntax_name self.text = text def __repr__(self): return '' % (self.id, self.paste_hash) Base.metadata.create_all() Session = sessionmaker(bind = engine, autoflush = True, autocommit = False) @contextmanager def session_scope(): session = Session() try: session.expire_on_commit = False yield session session.commit() except: session.rollback() raise finally: session.close()