À l'aide de SQLAlchemy session du Flacon soulève “SQLite objets créés dans un thread ne peut être utilisé dans ce même thread”
J'ai un Flacon de vue qui utilise SQLAlchemy à la requête et l'affichage de certains messages de blog. Je suis en cours d'exécution de mon application en utilisant mod_wsgi. Ce point de vue fonctionne la première fois que je vais à la page, mais renvoie une erreur 500 prochaine fois. Le traceback montre l'erreur ProgrammingError: SQLite objects created in a thread can only be used in that same thread.
Pourquoi j'obtiens cette erreur et comment la corriger?
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 [{}]
OriginalL'auteur J. Pawelczyk | 2015-11-30
Vous devez vous connecter pour publier un commentaire.
SQLAlchemy (et dans ce cas SQLite aussi) ne fonctionne pas si vous partagez une session sur les threads. Vous ne pouvez pas être à l'aide de threads explicitement, mais
mod_wsgi
, et vous avez défini un mondialsession
objet. Soit utiliserscoped_session
pour gérer la création d'une session unique pour chaque thread.De préférence, utilisez En Flacon De SQLAlchemy qui s'occupe de cela et d'autres choses pour vous. La SQLAlchemy docs vous recommandons l'utilisation de la bibliothèque d'intégration plutôt que de le faire vous-même.
Également noter que vous ne devriez être la définition du moteur, de la session, etc. une fois et de l'importer d'ailleurs, plutôt que de la redéfinir dans chaque fichier, comme votre code actuel n'.
OriginalL'auteur davidism
Prendre un soupçon de cette SORTE de réponse j'ai cherché SA docs trouvé et vous pouvez le faire:
scoped_session
n'était pas vraiment adapté à mon cas depuis Flacon-SQLAlchemy prend seulement une chaîne de connexion argument:Selon
sqlite3.se connecter
:OriginalL'auteur reubano