我正在使用SQLAlchemy的declarative_base来描述我的数据模式。在我的用例中,我将每天向数据库中插入大量数据,然后使用和操作这些数据作为业务对象。
我最初的方法是使用ORM方法来设置表,我的大部分“业务逻辑”都会与之交互,但是我正在使用Core来执行插入。这有几个原因。首先,我必须使用数百个单独的查询来获取web服务上的数据。每个查询将转换为数百/数千个数据库行。对于跨多个表和许多ForeignKeys的高度规范化模式,我只是认为最简单的方法是:
Queue接收查询结果并插入到表中。insert().from_select(...)查询来处理数据完整性,并将所有数据放在适当的位置。这将由一个单独的线程完成。我的问题是跨一个连接维护临时表。我好像要失去它了,我不明白为什么我跟踪了文档中的方法
代码的相关部分:
db模块包含引擎和帮助函数,以确保ForeignKey支持:
engine = create_engine('sqlite:///%s' % SQLDB, poolclass=StaticPool)
def get_connection():
conn = engine.connect()
conn.execute('pragma foreign_keys=on')
return connMain Thread创建表:
db.StagingTable.__table__.create(db.engine)每个工作线程(有两个线程,一个执行插入,一个执行INSERT INTO SELECT工作)使用助手函数获得连接:
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将维护一个可以传递到不同线程的开放连接。
发布于 2014-07-17 19:55:06
您必须至少执行一个Session.commit()才能实际向数据库写入某些内容,包括创建表所需的DDL。
你看到的问题是把INSERT写到一个还没有被CREATE编辑的桌子上。
https://stackoverflow.com/questions/24808363
复制相似问题