首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >跨线程的SQLite临时表

跨线程的SQLite临时表
EN

Stack Overflow用户
提问于 2014-07-17 16:00:02
回答 1查看 431关注 0票数 1

我正在使用SQLAlchemy的declarative_base来描述我的数据模式。在我的用例中,我将每天向数据库中插入大量数据,然后使用和操作这些数据作为业务对象。

我最初的方法是使用ORM方法来设置表,我的大部分“业务逻辑”都会与之交互,但是我正在使用Core来执行插入。这有几个原因。首先,我必须使用数百个单独的查询来获取web服务上的数据。每个查询将转换为数百/数千个数据库行。对于跨多个表和许多ForeignKeys的高度规范化模式,我只是认为最简单的方法是:

  1. 创建一个临时暂存表,以便在数据通过webservice进入时执行批量插入。一个线程将用于通过Queue接收查询结果并插入到表中。
  2. 一旦将所有数据插入临时表中,我将运行几个insert().from_select(...)查询来处理数据完整性,并将所有数据放在适当的位置。这将由一个单独的线程完成。
  3. 这是一个每天一次的过程,一旦完成,我的应用程序中使用ORM的“业务逻辑”将可用,并将其作为一个单独的应用程序执行。

我的问题是跨一个连接维护临时表。我好像要失去它了,我不明白为什么我跟踪了文档中的方法

代码的相关部分:

db模块包含引擎和帮助函数,以确保ForeignKey支持:

代码语言:javascript
运行
复制
engine = create_engine('sqlite:///%s' % SQLDB, poolclass=StaticPool)

def get_connection():
    conn = engine.connect()
    conn.execute('pragma foreign_keys=on')
    return conn

Main Thread创建表:

代码语言:javascript
运行
复制
db.StagingTable.__table__.create(db.engine)

每个工作线程(有两个线程,一个执行插入,一个执行INSERT INTO SELECT工作)使用助手函数获得连接:

代码语言:javascript
运行
复制
self.cn = db.get_connection()

部分追溯:

代码语言:javascript
运行
复制
  File "C:\FAST\Python266\lib\site-packages\sqlalchemy\engine\base.py", line 917, in _execute_context
    context)
  File "C:\FAST\Python266\lib\site-packages\sqlalchemy\engine\default.py", line 432, in do_executemany
    cursor.executemany(statement, parameters)
OperationalError: (OperationalError) no such table: staging u'INSERT INTO staging

我在这里错过了什么?我的印象是,StaticPool将维护一个可以传递到不同线程的开放连接。

EN

回答 1

Stack Overflow用户

发布于 2014-07-17 19:55:06

您必须至少执行一个Session.commit()才能实际向数据库写入某些内容,包括创建表所需的DDL。

你看到的问题是把INSERT写到一个还没有被CREATE编辑的桌子上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24808363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档