大容量插入获取的弱引用对象已不存在



我正试图将bulk_insert_mapping与SQL Alchemy和Firebird一起使用,但我遇到了一个问题。请注意,带有session.add()正常插入效果良好。

# This is a simple example that bulk insert filenames in history table
session.bulk_insert_mappings(
Historique,
[dict(fichier=f'fichier_{i}') for i in range(1, 10)]
)
session.commit()

我得到以下错误:

ERROR    sqlalchemy.pool.impl.QueuePool:base.py:1868 Error closing cursor
Traceback (most recent call last):
File "/home/manu/Dev/my_project/env/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1786, in _execute_context
result = context._setup_result_proxy()
File "/home/manu/Dev/my_project/env/lib/python3.8/site-packages/sqlalchemy/engine/default.py", line 1406, in _setup_result_proxy
result = self._setup_dml_or_text_result()
File "/home/manu/Dev/my_project/env/lib/python3.8/site-packages/sqlalchemy/engine/default.py", line 1488, in _setup_dml_or_text_result
strategy.alternate_cursor_description or self.cursor.description
File "/home/manu/Dev/my_project/env/lib/python3.8/site-packages/fdb/fbcore.py", line 3554, in __get_description
if self.__valid_ps():
File "/home/manu/Dev/my_project/env/lib/python3.8/site-packages/fdb/fbcore.py", line 3552, in __valid_ps
and not dir(self._ps))
ReferenceError: weakly-referenced object no longer exists
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/manu/Dev/my_project/env/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1865, in _safe_close_cursor
cursor.close()
File "/home/manu/Dev/my_project/env/lib/python3.8/site-packages/fdb/fbcore.py", line 3643, in close
if is_dead_proxy(self._ps):
File "/home/manu/Dev/my_project/env/lib/python3.8/site-packages/fdb/fbcore.py", line 481, in is_dead_proxy
return isinstance(obj, weakref.ProxyType) and not dir(obj)
ReferenceError: weakly-referenced object no longer exists

这就是我创建会话的方式:

@lru_cache()
def _get_session_maker(user, password, host, port, name, echo):
try:
engine = create_engine(
f'firebird://{user}:{password}@{host}'
f':{port}/{name}?charset=utf8',
echo=echo)
# Test que la base existe bien sur le serveur
engine.execute(text("SELECT 1 FROM RDB$DATABASE")).fetchone()
return sessionmaker(autocommit=False, autoflush=False, bind=engine)
except DatabaseError as e:
raise DatabaseError(f"-- Base '{name}': Connexion impossible", e.params, e.orig)

我以同样的方式在PostgreSQL数据库上使用bulk_insert_mapping,我没有任何问题。我该如何解决这个问题?

这是一个已知的问题,正如@snakecharmarb所提到的。我创建了一个修复它的分叉和一个PR