ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

python – 在theading.Thread中使用sqlalchemy scoped_session

2019-06-11 21:44:53  阅读:248  来源: 互联网

标签:python multithreading sqlalchemy python-3-4


我在使用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,multithreading,sqlalchemy,python-3-4
来源: https://codeday.me/bug/20190611/1221434.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有