Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 跨线程的SQLite临时表_Python_Sqlite_Sqlalchemy - Fatal编程技术网

Python 跨线程的SQLite临时表

Python 跨线程的SQLite临时表,python,sqlite,sqlalchemy,Python,Sqlite,Sqlalchemy,我正在使用SQLAlchemy的声明性_base来描述我的数据模式。在我的用例中,我将每天向数据库中插入大量数据,然后在事后将这些数据作为业务对象使用和操作 我最初的方法是使用ORM方法设置表,我的大多数“业务逻辑”都将与之交互,但是我使用Core进行插入。这有几个原因。首先,我必须使用数百个单独的查询通过web服务获取数据。每个查询将转换为数百/数千个数据库行。对于跨多个表和多个foreignkey的高度规范化模式,我认为最简单的方法如下: 创建一个临时暂存表,以便在数据通过Web服务传入时进

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

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

  • 创建一个临时暂存表,以便在数据通过Web服务传入时进行批量插入。一个线程将专用于通过
    队列
    接收查询结果并插入到表中
  • 将所有数据插入临时表后,我将从_select(…)查询中运行几个
    insert(),以处理数据完整性并将所有内容放在适当的位置。这将从一个单独的线程完成
  • 这是一个每天一次的流程,一旦完成,我的应用程序中使用ORM的“业务逻辑”端将可用,并作为一个单独的应用程序完成它的工作
  • 我的问题是跨单个连接维护临时表。我似乎失去了它,不明白为什么,因为我一直在跟踪

    相关的代码位:

    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的表中