Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将数据流传输到数据库以供Flask应用程序使用_Python_Sqlite_Flask_Sqlalchemy - Fatal编程技术网

Python 将数据流传输到数据库以供Flask应用程序使用

Python 将数据流传输到数据库以供Flask应用程序使用,python,sqlite,flask,sqlalchemy,Python,Sqlite,Flask,Sqlalchemy,我对这项任务相当陌生,所以请帮助我确定我缺少的概念 我试图将数据从API流式传输到我的SQLite db,并让Flask应用程序使用数据。我在models.py中这样定义了模型 #models.py 导入操作系统 从flask_sqlalchemy导入sqlalchemy #创建sqlite数据库 db=SQLAlchemy() 类MyDataModel(db.Model): #手动表名选择 __tablename_uu='table1' id=db.Column(db.Integer,主键=T

我对这项任务相当陌生,所以请帮助我确定我缺少的概念

我试图将数据从API流式传输到我的SQLite db,并让Flask应用程序使用数据。我在
models.py
中这样定义了模型

#models.py
导入操作系统
从flask_sqlalchemy导入sqlalchemy
#创建sqlite数据库
db=SQLAlchemy()
类MyDataModel(db.Model):
#手动表名选择
__tablename_uu='table1'
id=db.Column(db.Integer,主键=True)
在=db.Column(db.Text)处创建
text=db.Column(db.text)
def_uuuuinit_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
self.created_at=created_at
self.text=文本
定义报告(自我):
返回f“数据:{self.text}…在{self.created_at}创建”
app.py
中,我有一个简单的查看功能,可以计算行数并将服务器发送的事件返回到前端进行实时跟踪

#app.py
导入操作系统
导入时间
从烧瓶导入烧瓶,呈现模板,url,重定向,响应
从flask\u迁移导入迁移
从模型导入数据库,MyDataModel
从设置导入*
app=烧瓶(名称)
logging.basicConfig(级别=logging.DEBUG)
basedir=os.path.abspath(os.path.dirname(_文件__))
app.config['SQLALCHEMY\u DATABASE\u URI']=“sqlite://'+os.path.join(basedir,'data.sqlite')
app.config['SQLALCHEMY\u TRACK\u MODIFICATIONS']=False
db.init_应用程序(应用程序)
迁移(应用程序,数据库)
@应用程序路径(“/”)
def index():
返回渲染模板('index.html')
@app.route(“/getcount”)
def getcount():
def count_stream():
count=db.session.query(MyDataModel.count())
尽管如此:
产生f“数据:{str(计数)}\n\n”
睡眠时间(0.5)
返回响应(count_stream(),mimetype='text/event stream')
如果名称=“\uuuuu main\uuuuuuuu”:
运行(debug=True,port=port)
现在我有了另一个python脚本
stream_to_db.py
,它以流的形式从API获取数据,大致如下所示

#流到_db.py
导入日志记录
导入操作系统
从模型导入数据库,MyDataModel
从设置导入*
从SomeExternalAPI导入SomeAPI
def流_至_db():
api=SomeAPI(
API密钥、API密钥、访问令牌、访问令牌密钥
)
r=api.request()
对于r中的项目:
已创建,文本=项['created_at'],项['text']
logging.info(文本)
datum=MyDataModel(创建于,文本)
db.session.add(数据)
db.session.commit()
#将数据流传输到sqlite
流_到_db()
当我试图运行这个
python stream\u to_db.py
时,我得到了一个错误

RuntimeError: No application found. Either work inside a view function or push an application context. See http://flask-sqlalchemy.pocoo.org/contexts/.
我查看了应用程序上下文的文档,但仍然感到困惑。假设我不使用SQLAlchemy,直接使用Python和SQL进行数据插入,这个
stream_to_db.py
脚本应该独立于Flask应用程序。但是,如果我仍然想利用SQLAlchemy从
models.py
中获取语法和模型定义,我应该怎么做呢

从概念上讲,我觉得流到db部分独立于Flask应用程序,应该是一个基本上是
的脚本,而True
循环并永远持续。Flask应用程序只读取数据库,将数据发送到前端,而不执行其他操作。我尝试将
stream\u to\u db()
函数放入
app.py
中的
\u main\u\u
中,但这没有意义,
app.run()
stream\u to\u db()
基本上都是
而True
循环,不能放在一起

我迷路了,错过了这里的关键概念。请帮助并建议正确的方法/最佳实践。我觉得这是一项非常基本的任务,应该有一个最佳实践和一套专用工具。提前谢谢


编辑

为了进一步实验,我将
app
导入
stream\u To_db.py
并添加了

with app.app_context():
    stream_to_db()
现在我可以毫无问题地运行
python stream_to_db.py
,但是如果我同时启动Flask应用程序,我会得到几个

Debugging middleware caught exception in streamed response at a point where response headers were already sent.
而且

Traceback (most recent call last):
  File "/Users/<username>/webapps/<appname>/venv/lib/python3.6/site-packages/werkzeug/wsgi.py", line 507, in __next__
    return self._next()
  File "/Users/<username>/webapps/<appname>/venv/lib/python3.6/site-packages/werkzeug/wrappers/base_response.py", line 45, in _iter_encoded
    for item in iterable:
  File "/Users/<username>/webapps/<appname>/app.py", line 33, in count_stream
    count = db.session.query(CardanoTweet).count()
  File "/Users/<username>/webapps/<appname>/venv/lib/python3.6/site-packages/sqlalchemy/orm/scoping.py", line 162, in do
    return getattr(self.registry(), name)(*args, **kwargs)
  File "/Users/<username>/webapps/<appname>/venv/lib/python3.6/site-packages/sqlalchemy/util/_collections.py", line 1012, in __call__
    return self.registry.setdefault(key, self.createfunc())
  File "/Users/<username>/webapps/<appname>/venv/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 3214, in __call__
    return self.class_(**local_kw)
  File "/Users/<username>/webapps/<appname>/venv/lib/python3.6/site-packages/flask_sqlalchemy/__init__.py", line 136, in __init__
    self.app = app = db.get_app()
  File "/Users/<username>/webapps/<appname>/venv/lib/python3.6/site-packages/flask_sqlalchemy/__init__.py", line 982, in get_app
    'No application found. Either work inside a view function or push'
RuntimeError: No application found. Either work inside a view function or push an application context. See http://flask-sqlalchemy.pocoo.org/contexts/.
回溯(最近一次呼叫最后一次):
文件“/用户//webapps/

问题不是将数据从Flask流式传输到客户端,而是将数据从外部API流式传输到DB,并让Flask使用DB中数据的一些统计信息。因此,我不明白为什么从概念上讲,流式作业应该与Flask相关,它们是独立的。问题是,我在流式作业中为数据m使用SQLAlchemyodel和db事务,以及SQLAlchemy需要定义Flask应用程序。这一部分是我感到困惑的地方


使用SQLAlchemy定义的数据模型,编写将数据流传输到db的不断运行的后台作业的正确方法是什么?我是否应该从流代码中去掉SQLAlchemy代码,只使用SQL,并手动确保模式同意是否有进一步的迁移?

请尝试在models.py中进行以下更改你已经创建了db。
db=SQLAlchemy(app)

不需要将app导入models.py,这会创建循环依赖关系。我遇到了这个问题,正在
app.py
中使用
db.init\u app(app)
,留下
db=SQLAlchemy()
不使用app以避免在models.py中导入app我尝试将所有代码从models.py移动到app.py,并使用了
db=SQLAlchemy(app)
正如您所建议的那样,它成功了!谢谢您的建议,但我仍然不知道如何在没有循环依赖的情况下正确地将模型代码分离到models.py。我还有一个关于在stream\u to\u db.py中使用应用程序上下文的问题。您能看看我的编辑吗?谢谢!这绝对与问题无关。您可以先创建
SQLAlchemy()
实例,然后使用
.init\u app()
将其附加到
Flask
对象。OP已经使用
db.init\u app(app)
@loganyyang正确地执行了此操作。不,抱歉,这不可能有效,因为您没有使用
stream\u with\u context()
。您已经附加了
SQLA