from sqlalchemy import create_engine, Integer, String, BIGINT, Column, DateTime from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker from sqlalchemy import select, update from flask import Flask app = Flask(__name__) engine = create_engine('postgresql+psycopg2://postgres:postgres@postgres.vdk2ch.ru:5432/jack_bot', echo=True) Session = sessionmaker(bind=engine) Base = declarative_base() class user(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) user_id = Column(Integer) user_fullname = Column(String) dick_size = (Column(Integer)) datetimes = (Column(DateTime)) chat_id = Column(BIGINT) def get_top_dicks(): session = Session() top = session.query(user.user_fullname, user.dick_size, user.user_id, user.chat_id).order_by(user.dick_size.desc()).all() session.close() return top @app.route('/metrics') def metrics(): metrics = "" docks = get_top_dicks() # текущий размер пипис for dick in docks: metrics += 'pipisio{user="%s", user_id="%s", chat_id="%s"} %s\n' % (dick[0], dick[2], dick[3], dick[1]) # расстояние до следующего впереди for k in range(len(docks)): ### не самый красивый код для не самой красивой ситуации if k == 0: metrics += 'pipisio_topdick_distanso{user="%s", user_id="%s", chat_id="%s"} %s\n' % (dick[0], dick[2], dick[3], 0) else: i = k - 1 upper_dick_size = docks[i][1] while i > 0 and upper_dick_size == docks[k][1]: i -= 1 upper_dick_size = docks[i][1] if i == 0: metrics += 'pipisio_topdick_distanso{user="%s", user_id="%s", chat_id="%s"} %s\n' % (dick[0], dick[2], dick[3], 0) else: metrics += 'pipisio_topdick_distanso{user="%s", user_id="%s", chat_id="%s"} %s\n' % (dick[0], dick[2], dick[3], (upper_dick_size - docks[k][1])) return metrics if __name__ == '__main__': app.run(host='0.0.0.0', port=9992) engine.dispose()