多处理和SQLAlchemy错误

时间:2016-06-07 10:33:51

标签: python sqlite sqlalchemy

我们正在构建一个软件,可以读取数千个XML文件,并使用SQLAlchemy将其内容导入SQLite数据库。

请在下面找到我们代码的相关部分:

文件1:

from multiprocessing.dummy import Pool as ThreadPool
...
for file in os.listdir(path):
    if file.endswith("-endpoint.xml"):
        xmls.append([self.database, os.path.join(path, file), self.debug])

pool = ThreadPool(threads)
try:
    def multi_run_wrapper(args):
        return collectors.import_asset(*args)

    results = pool.map(multi_run_wrapper, xmls)
    pool.close()
    pool.join()
except:
    if self.debug:
        traceback.print_exc(file=sys.stdout)

文件2,第1部分:

def import_asset(db, xml, debug = False):
    tree = ET.parse(xml)
    root = tree.getroot()
    signcheck = root.find('Signcheck')
    usersArray = []
    running_processes = []
    autoruns = []

    machine_id = add_machine(root, xml, db, debug)

文件2,第2部分:

def add_machine(root, file_path, db, debug = False):
    ...
    machine = Machine(hostname=hostname, operating_system=operating_system, version=Version)
    db.add(machine)
    db.commit()

文件3:

在整个代码中,' db'无论此函数的返回值是什么:

def open(sqlite_db_path = None):
    engine = create_engine('sqlite:///' + sqlite_db_path)
    session = sessionmaker()
    session.configure(bind=engine)
    return scoped_session(session())

错误消息:

TypeError: 'Session' object is not callable

我们已阅读here,scoped_session()不返回真正的Session()对象。但我们无法使用该信息来修复我们的代码。

提前感谢你对这个障碍的帮助。

2 个答案:

答案 0 :(得分:3)

当您应该拨打session时,您正在呼叫会话工厂scoped_session。(请参阅Contextual/Thread-local Sessions)。

所以它应该是

scoped_session(session)()

而不是

scoped_session(session())

为避免混淆,我建议将session重命名为session_factory。所以这样的事情应该有效:

def open(sqlite_db_path = None):
    engine = create_engine('sqlite:///' + sqlite_db_path)
    session_factory = sessionmaker(bind=engine)
    return scoped_session(session_factory)()

答案 1 :(得分:2)

对此的修复只是替换它:

def open(sqlite_db_path = None):
    engine = create_engine('sqlite:///' + sqlite_db_path)
    session = sessionmaker()
    session.configure(bind=engine)
    return scoped_session(session())

有了这个:

engine = create_engine('sqlite:///' + sqlite_db_path)
session_factory = sessionmaker(bind=engine)
return scoped_session(session_factory)

感谢所有响应此主题的人。