我有一个使用SQLAlchemy的查询和显示一些博客文章的烧瓶视图。我使用mod_wsgi的运行我的应用程序。这种观点的作品我第一次去的网页,但返回500错误下一次。回溯显示错误ProgrammingError: SQLite objects created in a thread can only be used in that same thread.
为什么会出现这个错误,我该如何解决?
views.py
engine = create_engine('sqlite:////var/www/homepage/blog.db')
Base.metadata.bind = engine
DBSession = sessionmaker(bind = engine)
session = DBSession()
@app.route('/blog')
@app.route('/blog.html')
def blog():
entrys = session.query(Entry).order_by(desc(Entry.timestamp)).all()
return render_template('blog.html', blog_entrys = entrys)
models.py
:
class Entry(Base):
__tablename__ = 'entry'
id = Column(Integer, primary_key = True)
title = Column(String(100), nullable = False)
body = Column(String, nullable = False)
timestamp = Column(DateTime, nullable = False)
featured = Column(Boolean, nullable = False)
comments = relationship('Comment')
def is_featured(self):
return self.featured
class Comment(Base):
__tablename__ = 'comment'
id = Column(Integer, primary_key = True)
entry_id = Column(Integer, ForeignKey('entry.id'))
text = Column(String(500), nullable = False)
name = Column(String(80))
engine = create_engine('sqlite:////var/www/homepage/blog.db')
Base.metadata.create_all(engine)
Exception on /blog.html [GET]
Traceback (most recent call last):
File "/usr/lib/python2.6/dist-packages/flask/app.py", line 861, in wsgi_app
rv = self.dispatch_request()
File "/usr/lib/python2.6/dist-packages/flask/app.py", line 696, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/var/www/homepage/webserver.py", line 38, in blog
entrys = session.query(Entry).order_by(desc(Entry.timestamp)).all()
File "/usr/lib/python2.6/dist-packages/sqlalchemy/orm/query.py", line 1453, in all
return list(self)
File "/usr/lib/python2.6/dist-packages/sqlalchemy/orm/query.py", line 1565, in __iter__
return self._execute_and_instances(context)
File "/usr/lib/python2.6/dist-packages/sqlalchemy/orm/query.py", line 1570, in _execute_and_instances
mapper=self._mapper_zero_or_none())
File "/usr/lib/python2.6/dist-packages/sqlalchemy/orm/session.py", line 735, in execute
clause, params or {})
File "/usr/lib/python2.6/dist-packages/sqlalchemy/engine/base.py", line 1157, in execute
params)
File "/usr/lib/python2.6/dist-packages/sqlalchemy/engine/base.py", line 1235, in _execute_clauseelement
parameters=params
File "/usr/lib/python2.6/dist-packages/sqlalchemy/engine/base.py", line 1348, in __create_execution_context
None, None)
File "/usr/lib/python2.6/dist-packages/sqlalchemy/engine/base.py", line 1343, in __create_execution_context
connection=self, **kwargs)
File "/usr/lib/python2.6/dist-packages/sqlalchemy/engine/default.py", line 381, in __init__
self.cursor = self.create_cursor()
File "/usr/lib/python2.6/dist-packages/sqlalchemy/engine/default.py", line 523, in create_cursor
return self._connection.connection.cursor()
File "/usr/lib/python2.6/dist-packages/sqlalchemy/pool.py", line 383, in cursor
c = self.connection.cursor(*args, **kwargs)
ProgrammingError: (ProgrammingError) SQLite objects created in a thread can only be used in that same thread.The object was created in thread id 140244498364160 and this is thread id 140244523542272 None [{}]
如果共享线程之间的会话的SQLAlchemy(在这种情况下SQLite的也有)不起作用。您可能没有使用线程明确,但mod_wsgi
就是和你定义一个全局session
对象。无论是使用scoped_session
处理创建为每个线程唯一的会话。
session = scoped_session(sessionmaker(bind=engine))
@app.teardown_request
def remove_session(ex=None):
session.remove()
@app.route('/')
def example():
item = session.query(MyModel).filter(...).all()
...
最好使用烧瓶SQLAlchemy的它处理这个和其他的东西给你。在SQLAlchemy的文档建议您使用集成库,而不是这样做你自己。
db = SQLAlchemy(app)
@app.route('/')
def example():
item = db.session.query(MyModel).filter(...).all()
...
还要注意的是,你应该只定义引擎,会话等曾经和其他地方进口的,而不是像当前的代码不会在每个文件重新定义。
问题内容: 我是编程新手。我以前尝试过MySQL,但现在是我第一次在python flask网站上使用SQLite。因此,也许我使用的是MySQL语法而不是SQLite,但似乎找不到问题。 这是否意味着我不能在HTML文件中使用名称,电子邮件用户名和密码?我该如何解决? 谢谢。 问题答案: 您的游标“ c”不在同一线程中创建;它可能是在Flask应用运行时初始化的。 您可能希望使用相同的方法生成S
问题内容: 我有一个简单的线程是这样的: 编辑:开始运行的附加代码 它是主要活动的内部类。但是, 此线程 不是在主 活动 上 运行,而是在 另一个 在 主 活动上 运行的线程 内部 运行 。 无论如何,此示例与此处 完全相同 ,但是由于某种原因,它给了我java.lang.RuntimeException:每个线程只能创建一个Looper。 我没有创建任何其他循环程序,至少在任何地方都没有。 问题
我编写了代码示例: 每100毫秒提交一个新任务(总任务量-20)。每个任务持续时间-0.5秒。因此,可以并行执行5个任务,最佳执行时间为:20*100 500=2.5秒,池应创建5个线程 但我的实验显示为9.6秒。我打开jsvisualvm查看池创建了多少线程,我看到只创建了一个线程: 请更正我的线程池配置不正确的地方。
我正在设计一个模块,可以支持不同的数据源。我的模块获取用户的公司id作为输入,并且我必须根据公司id调用适当的类。我正在尝试合并一些好的设计,尽可能避免条件语句。 我有一个使用此方法的FetchDataSource单例类。 “communicator”是一个接口,而communicator映射将返回适当的实例。这是同一个单例类中的populateCommunicatorMap()方法。
我正在学习多线程的基础知识,并且正在编写一个程序来理解使用两种创建线程的方法之间的区别。 我已经读到,使用Runnable允许多个线程共享同一个对象,并希望在扩展线程时尝试类似的事情。因此,在创建了Demo2的新对象之后,我将引用传递给了线程构造函数(类似于我们在Runnable中所做的)。 当objT1,tT1,tT2将总和的值增加到3时,我达到了我想要达到的目标。但是在打印当前线程的名称时,它
我正在学习多线程的基础知识,并且正在编写一个程序来理解使用两种创建线程的方法之间的区别。 我已经读到,使用Runnable允许多个线程共享同一个对象,并希望在扩展线程时尝试类似的事情。因此,在创建了Demo2的新对象之后,我将引用传递给了线程构造函数(类似于我们在Runnable中所做的)。 当objT1,tT1,tT2将总和的值增加到3时,我达到了我想要达到的目标。但是在打印当前线程的名称时,它