python – 在theading.Thread中使用sqlalchemy scoped_session
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 在theading.Thread中使用sqlalchemy scoped_session,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2037字,纯文字阅读大概需要3分钟。
内容图文
![python – 在theading.Thread中使用sqlalchemy scoped_session](/upload/InfoBanner/zyjiaocheng/909/6b961c419fca45ef9a254abb4ab0070f.jpg)
我在使用sqlalchemy和线程时遇到了问题.
import queue
import threading
import sqlalchemy
from sqlalchemy import create_engine, Column, Integer, String, Sequence
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm.scoping import scoped_session
engine = create_engine('sqlite:///:memory:', echo=False)
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, Sequence('user_id_seq'), primary_key=True)
name = Column(String)
fullname = Column(String)
password = Column(String)
def __repr__(self):
return "<User(name='%s', fullname='%s', password='%s')>" % (
self.name, self.fullname, self.password)
Base.metadata.create_all(engine)
sessionfactory = sessionmaker(bind=engine)
# called by each thread
def write_name(q, name, sessionfactory):
session = scoped_session(sessionfactory)
ed_user = User(name=name, fullname='Power', password='edspassword')
session.add(ed_user)
session.commit()
q.put(name)
names = ["Max", "Austin"]
q = queue.Queue()
for u in names:
t = threading.Thread(target=write_name, args = (q, u, sessionfactory))
t.daemon = True
t.start()
s = q.get()
这导致:
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: users [SQL: 'INSERT INTO users (name, fullname, password) VALUES (?, ?, ?)'] [parameters: ('Max', 'Power', 'edspassword')]
但它可以在主线程中添加和读取数据.此外,我假设我需要在多进程上使用线程,因为scoped_session使用线程本地存储.
解决方法:
主要问题是您不能与仅存在于内存中的SQLite数据库建立多个连接,因为每个连接都将创建一个新的空数据库.请参阅SQLAlchemy docs.简而言之,您需要像这样创建引擎,以确保只有一个可以跨线程共享的实例.
from sqlalchemy.pool import StaticPool
engine = create_engine('sqlite://:memory:',
connect_args={'check_same_thread': False},
poolclass=StaticPool, echo=True)
一旦你这样做,你就不需要scoped_session,因为scoped_session的意思是为每个线程创建一个连接,你在这里特别不能这样做.
另外,请注意,如果您希望它正常工作(使用非SQLite引擎),您应该只有一个scoped_session实例.您应该将其视为全局变量,然后它将能够处理线程本地的东西.
内容总结
以上是互联网集市为您收集整理的python – 在theading.Thread中使用sqlalchemy scoped_session全部内容,希望文章能够帮你解决python – 在theading.Thread中使用sqlalchemy scoped_session所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。