Python 在烧瓶模板之间共享大型sqlalchemy对象
我有一个flask应用程序,我想用它对postgresql数据库中的一个非常大的数据集进行数据可视化 我有sqlalchemy,plotly,GoogleMaps设置,但我当前的问题是,我想从数据库中获取一个相当大的数据集,并将其传递给一个模板,该模板将负责执行一些不同的可视化。我只想在站点启动时加载一次数据,然后避免在以后导航其他页面时运行它 我可以使用哪些方法来实现这一点?我如何访问在其他页面(模板)中获得的数据? 我在某个地方读到了关于Python 在烧瓶模板之间共享大型sqlalchemy对象,python,postgresql,flask,flask-sqlalchemy,large-data,Python,Postgresql,Flask,Flask Sqlalchemy,Large Data,我有一个flask应用程序,我想用它对postgresql数据库中的一个非常大的数据集进行数据可视化 我有sqlalchemy,plotly,GoogleMaps设置,但我当前的问题是,我想从数据库中获取一个相当大的数据集,并将其传递给一个模板,该模板将负责执行一些不同的可视化。我只想在站点启动时加载一次数据,然后避免在以后导航其他页面时运行它 我可以使用哪些方法来实现这一点?我如何访问在其他页面(模板)中获得的数据? 我在某个地方读到了关于session的内容,我试图实现这样一个功能,但后来我
session
的内容,我试图实现这样一个功能,但后来我遇到了一个“不可序列化错误”,我通过将对象解析为JSON来修复这个错误,但随后我遇到了一个“头太大”错误。我觉得我有点不可能了
只是为了展示一些代码,下面是我目前正在处理的问题
Models.py:
从sqlalchemy导入BigInteger、列、JSON、文本
从应用程序导入数据库
类别表910(数据库模型):
__tablename_uuu='table_910'
id=db.Column(biginger,主键=True)
did=db.列(文本)
timestamp=db.Column(BigInteger)
data=db.Column(JSON)
db_timestamp=db.Column(BigInteger)
def项目(自身):
返回{'id':self.id,'did':self.did,'timestamp':self.timestamp,'data':self.data,'db_timestamp':self.db_timestamp}
定义报告(自我):
返回“”%(self.did,self.id)
Views.py
从flask导入渲染模板,会话
从应用程序导入应用程序、数据库、模型
从日期时间导入日期时间
将matplotlib.dates导入为mdates
将matplotlib.pyplot作为plt导入
将numpy作为np导入
导入json
绘声绘色地导入
@应用程序路径(“/”)
@应用程序路径(“/index”)
def index():
#从数据库中提取(运行大约需要50秒)
行=models.Table910.query\
.filter_by(did='357139052424715')\
.过滤器((models.Table910.timestamp>146684692000)和(models.Table910.timestamp<1467017760000))\
.order_by(models.Table910.timestamp.asc())
#
#在绘图上管理和绘制数据
#
返回呈现模板('index.html',
ids=ids,
graphJSON=graphJSON,
行=行,
线路坐标=线路坐标)
编辑:
我可能已经解释了我的问题有点太模糊了,因此我想用一个特定的页面来加载数据,然后用另一个页面来绘制图形。目前我能想到的最好的方法是能够按下一个按钮获取数据,一旦数据加载,按下另一个按钮绘制图表。。如何实现这一点?存储在
会话中的数据被放置在签名的cooky中。cooky的最大大小约为4096字节。你不应该在那里存储大数据。啊,我明白了。很高兴知道。那么这不是我应该使用的程序。我想用一个文件来写,只要没有人有更好的建议。存储在会话
中的数据放在一个签名的cooky中。cooky的最大大小约为4096字节。你不应该在那里存储大数据。啊,我明白了。很高兴知道。那么这不是我应该使用的程序。我想用一个文件来写,只要没有人有更好的建议。
from sqlalchemy import BigInteger, Column, JSON, Text
from app import db
class Table910(db.Model):
__tablename__ = 'table_910'
id = db.Column(BigInteger, primary_key=True)
did = db.Column(Text)
timestamp = db.Column(BigInteger)
data = db.Column(JSON)
db_timestamp = db.Column(BigInteger)
def items(self):
return {'id': self.id, 'did': self.did, 'timestamp': self.timestamp, 'data': self.data, 'db_timestamp': self.db_timestamp}
def __repr__(self):
return '<1_Data %r, %r>' % (self.did, self.id)
from flask import render_template, session
from app import app, db, models
from datetime import datetime
import matplotlib.dates as mdates
import matplotlib.pyplot as plt
import numpy as np
import json
import plotly
@app.route('/')
@app.route('/index')
def index():
# fetching from the database (takes ~50 seconds to run)
rows = models.Table910.query \
.filter_by(did='357139052424715') \
.filter((models.Table910.timestamp > 1466846920000) & (models.Table910.timestamp < 1467017760000)) \
.order_by(models.Table910.timestamp.asc())
#
# managing and drawing data on plots
#
return render_template('index.html',
ids=ids,
graphJSON=graphJSON,
rows=rows,
routeCoordinates=routeCoordinates))