Python 跨线程的SQLite临时表
我正在使用SQLAlchemy的Python 跨线程的SQLite临时表,python,sqlite,sqlalchemy,Python,Sqlite,Sqlalchemy,我正在使用SQLAlchemy的声明性_base来描述我的数据模式。在我的用例中,我将每天向数据库中插入大量数据,然后在事后将这些数据作为业务对象使用和操作 我最初的方法是使用ORM方法设置表,我的大多数“业务逻辑”都将与之交互,但是我使用Core进行插入。这有几个原因。首先,我必须使用数百个单独的查询通过web服务获取数据。每个查询将转换为数百/数千个数据库行。对于跨多个表和多个foreignkey的高度规范化模式,我认为最简单的方法如下: 创建一个临时暂存表,以便在数据通过Web服务传入时进
声明性_base
来描述我的数据模式。在我的用例中,我将每天向数据库中插入大量数据,然后在事后将这些数据作为业务对象使用和操作
我最初的方法是使用ORM
方法设置表,我的大多数“业务逻辑”都将与之交互,但是我使用Core
进行插入。这有几个原因。首先,我必须使用数百个单独的查询通过web服务获取数据。每个查询将转换为数百/数千个数据库行。对于跨多个表和多个foreignkey的高度规范化模式,我认为最简单的方法如下:
队列
接收查询结果并插入到表中insert(),以处理数据完整性并将所有内容放在适当的位置。这将从一个单独的线程完成
db
模块包含发动机和辅助功能,以确保启用外键支持:
engine = create_engine('sqlite:///%s' % SQLDB, poolclass=StaticPool)
def get_connection():
conn = engine.connect()
conn.execute('pragma foreign_keys=on')
return conn
主线程创建表:
db.StagingTable.__table__.create(db.engine)
每个辅助线程(有两个,一个执行INSERT,一个执行INSERT-INTO-SELECT
work)使用helper函数获取连接:
self.cn = db.get_connection()
部分回溯:
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
将维护一个可以传递到不同线程的开放连接。您必须至少执行一次会话。commit()
才能向数据库实际写入内容,包括创建表的DDL
您看到的问题是将INSERT
ing写入到尚未CREATE
ed的表中