【问题标题】:"KeyError: 0" when connecting to MySQL (get_default_isolation_level)连接 MySQL 时出现“KeyError: 0” (get_default_isolation_level)
【发布时间】:2021-10-30 08:29:34
【问题描述】:

目前正在使用 sqlalchemy 版本 1.4.23 为 python 3.9.6 开发,每当我使用 sqlalchemy 连接到数据库时,我都会收到以下堆栈跟踪错误:

Traceback (most recent call last):
  File "/mnt/c/Importer/common/db.py", line 106, in db_cur
    with engine.connect() as con:
  File "/home/jimmy/.local/share/virtualenvs/Importer-0-6a4YAh/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 3166, in connect
    return self._connection_cls(self, close_with_result=close_with_result)
  File "/home/jimmy/.local/share/virtualenvs/Importer-0-6a4YAh/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 96, in __init__
    else engine.raw_connection()
  File "/home/jimmy/.local/share/virtualenvs/Importer-0-6a4YAh/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 3245, in raw_connection
    return self._wrap_pool_connect(self.pool.connect, _connection)
  File "/home/jimmy/.local/share/virtualenvs/Importer-0-6a4YAh/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 3212, in _wrap_pool_connect
    return fn()
  File "/home/jimmy/.local/share/virtualenvs/Importer-0-6a4YAh/lib/python3.9/site-packages/sqlalchemy/pool/base.py", line 307, in connect
    return _ConnectionFairy._checkout(self)
  File "/home/jimmy/.local/share/virtualenvs/Importer-0-6a4YAh/lib/python3.9/site-packages/sqlalchemy/pool/base.py", line 767, in _checkout
    fairy = _ConnectionRecord.checkout(pool)
  File "/home/jimmy/.local/share/virtualenvs/Importer-0-6a4YAh/lib/python3.9/site-packages/sqlalchemy/pool/base.py", line 425, in checkout
    rec = pool._do_get()
  File "/home/jimmy/.local/share/virtualenvs/Importer-0-6a4YAh/lib/python3.9/site-packages/sqlalchemy/pool/impl.py", line 146, in _do_get
    self._dec_overflow()
  File "/home/jimmy/.local/share/virtualenvs/Importer-0-6a4YAh/lib/python3.9/site-packages/sqlalchemy/util/langhelpers.py", line 70, in __exit__
    compat.raise_(
  File "/home/jimmy/.local/share/virtualenvs/Importer-0-6a4YAh/lib/python3.9/site-packages/sqlalchemy/util/compat.py", line 207, in raise_
    raise exception
  File "/home/jimmy/.local/share/virtualenvs/Importer-0-6a4YAh/lib/python3.9/site-packages/sqlalchemy/pool/impl.py", line 143, in _do_get
    return self._create_connection()
  File "/home/jimmy/.local/share/virtualenvs/Importer-0-6a4YAh/lib/python3.9/site-packages/sqlalchemy/pool/base.py", line 253, in _create_connection
    return _ConnectionRecord(self)
  File "/home/jimmy/.local/share/virtualenvs/Importer-0-6a4YAh/lib/python3.9/site-packages/sqlalchemy/pool/base.py", line 368, in __init__
    self.__connect()
  File "/home/jimmy/.local/share/virtualenvs/Importer-0-6a4YAh/lib/python3.9/site-packages/sqlalchemy/pool/base.py", line 622, in __connect
    pool.dispatch.connect.for_modify(
  File "/home/jimmy/.local/share/virtualenvs/Importer-0-6a4YAh/lib/python3.9/site-packages/sqlalchemy/event/attr.py", line 329, in _exec_w_sync_on_first_run
    self(*args, **kw)
  File "/home/jimmy/.local/share/virtualenvs/Importer-0-6a4YAh/lib/python3.9/site-packages/sqlalchemy/event/attr.py", line 343, in __call__
    fn(*args, **kw)
  File "/home/jimmy/.local/share/virtualenvs/Importer-0-6a4YAh/lib/python3.9/site-packages/sqlalchemy/util/langhelpers.py", line 1691, in go
    return once_fn(*arg, **kw)
  File "/home/jimmy/.local/share/virtualenvs/Importer-0-6a4YAh/lib/python3.9/site-packages/sqlalchemy/engine/create.py", line 674, in first_connect
    dialect.initialize(c)
  File "/home/jimmy/.local/share/virtualenvs/Importer-0-6a4YAh/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/base.py", line 2961, in initialize
    default.DefaultDialect.initialize(self, connection)
  File "/home/jimmy/.local/share/virtualenvs/Importer-0-6a4YAh/lib/python3.9/site-packages/sqlalchemy/engine/default.py", line 407, in initialize
    self.default_isolation_level = self.get_default_isolation_level(
  File "/home/jimmy/.local/share/virtualenvs/Importer-0-6a4YAh/lib/python3.9/site-packages/sqlalchemy/engine/default.py", line 473, in get_default_isolation_level
    return self.get_isolation_level(dbapi_conn)
  File "/home/jimmy/.local/share/virtualenvs/Importer-0-6a4YAh/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/base.py", line 2720, in get_isolation_level
    val = row[0]
KeyError: 0

我可以通过手动更改文件来解决问题 val = row[0]val = row['@@transaction_isolation'] 但我不想在安装后手动更改依赖文件。我尝试在创建引擎时手动设置事务隔离,但这并不能阻止调用 get_isolation_level() ,因此错误仍然存​​在。 sqlalchemy 与 python 3.9.6 不兼容吗?这和mysql服务器版本有关系吗?

【问题讨论】:

  • 您使用的是什么驱动程序(DBAPI 层)?换句话说,“mysql+xxx://…”中的“xxx”对于你的连接 URI 是什么?
  • 我没有指定一个,每个文档 'mysql-python' 是默认的
  • 您可以通过print(engine.dialect.driver)确认。
  • DBAPI 是 mysqldb
  • 好的,所以mysql+mysqldb:// 确实是默认驱动程序,并且使用非常广泛。现在检查您正在使用的实际连接 URI。它是否提到了“cursorclass”或“DictCursor”?

标签: python mysql python-3.x sqlalchemy


【解决方案1】:

问题在于连接中使用的 DictCursor。将 SELECT @@transaction_isolation 的 _fetch_type 更改为元组而不是字典解决了这个问题。

【讨论】:

    猜你喜欢
    • 2016-03-18
    • 1970-01-01
    • 2022-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 2017-08-11
    相关资源
    最近更新 更多