【问题标题】:sql_alchemy.create_engine and pd.read_sql throws IndexError: tuple index out of range on first connectsql_alchemy.create_engine 和 pd.read_sql 抛出 IndexError: tuple index out of range on first connect
【发布时间】:2021-10-27 13:22:06
【问题描述】:

我混淆了USERPASSDB_SERVERDB_NAME。前面的变量的值都不包含特殊字符,它们只是字母数字。

我正在连接到 mssql db 的 linux 机器上使用以下内容创建引擎:

抛出IndexError: tuple index out of range

import sqlalchemy
DRIVER="FreeTDS&PORT=1433&TDS_VERSION=8.0"
sqlalchemy.create_engine(f"mssql+pyodbc://{USER}:{PASS}@{DB_SERVER}/{DB_NAME}?driver={DRIVER}")

然后将引擎传递给 pandas read_sql 调用。

但是,如果我在 Windows 上运行它,那很好:

import sqlalchemy
DRIVER='SQL+Server+Native+Client+11.0'
sqlalchemy.create_engine(f"mssql+pyodbc://{USER}:{PASS}@{DB_SERVER}/{DB_NAME}?driver={DRIVER}")

这是经过混淆的堆栈跟踪:

Traceback (most recent call last):
...
  File "{HOME}/.conda/envs/test_env/lib/python3.7/site-packages/pandas/io/sql.py", line 515, in read_sql
    chunksize=chunksize,
  File "{HOME}/.conda/envs/test_env/lib/python3.7/site-packages/pandas/io/sql.py", line 1295, in read_query
    result = self.execute(*args)
  File "{HOME}/.conda/envs/test_env/lib/python3.7/site-packages/pandas/io/sql.py", line 1162, in execute
    *args, **kwargs
  File "{HOME}/.conda/envs/test_env/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 2236, in execute
    connection = self._contextual_connect(close_with_result=True)
  File "{HOME}/.conda/envs/test_env/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 2304, in _contextual_connect
    self._wrap_pool_connect(self.pool.connect, None),
  File "{HOME}/.conda/envs/test_env/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 2338, in _wrap_pool_connect
    return fn()
  File "{HOME}/.conda/envs/test_env/lib/python3.7/site-packages/sqlalchemy/pool/base.py", line 364, in connect
    return _ConnectionFairy._checkout(self)
  File "{HOME}/.conda/envs/test_env/lib/python3.7/site-packages/sqlalchemy/pool/base.py", line 778, in _checkout
    fairy = _ConnectionRecord.checkout(pool)
  File "{HOME}/.conda/envs/test_env/lib/python3.7/site-packages/sqlalchemy/pool/base.py", line 495, in checkout
    rec = pool._do_get()
  File "{HOME}/.conda/envs/test_env/lib/python3.7/site-packages/sqlalchemy/pool/impl.py", line 140, in _do_get
    self._dec_overflow()
  File "{HOME}/.conda/envs/test_env/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py", line 69, in __exit__
    exc_value, with_traceback=exc_tb,
  File "{HOME}/.conda/envs/test_env/lib/python3.7/site-packages/sqlalchemy/util/compat.py", line 182, in raise_
    raise exception
  File "{HOME}/.conda/envs/test_env/lib/python3.7/site-packages/sqlalchemy/pool/impl.py", line 137, in _do_get
    return self._create_connection()
  File "{HOME}/.conda/envs/test_env/lib/python3.7/site-packages/sqlalchemy/pool/base.py", line 309, in _create_connection
    return _ConnectionRecord(self)
  File "{HOME}/.conda/envs/test_env/lib/python3.7/site-packages/sqlalchemy/pool/base.py", line 440, in __init__
    self.__connect(first_connect_check=True)
  File "{HOME}/.conda/envs/test_env/lib/python3.7/site-packages/sqlalchemy/pool/base.py", line 666, in __connect
    ).exec_once_unless_exception(self.connection, self)
  File "{HOME}/.conda/envs/test_env/lib/python3.7/site-packages/sqlalchemy/event/attr.py", line 314, in exec_once_unless_exception
    self._exec_once_impl(True, *args, **kw)
  File "{HOME}/.conda/envs/test_env/lib/python3.7/site-packages/sqlalchemy/event/attr.py", line 285, in _exec_once_impl
    self(*args, **kw)
  File "{HOME}/.conda/envs/test_env/lib/python3.7/site-packages/sqlalchemy/event/attr.py", line 322, in __call__
    fn(*args, **kw)
  File "{HOME}/.conda/envs/test_env/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py", line 1513, in go
    return once_fn(*arg, **kw)
  File "{HOME}/.conda/envs/test_env/lib/python3.7/site-packages/sqlalchemy/engine/strategies.py", line 199, in first_connect
    dialect.initialize(c)
  File "{HOME}/.conda/envs/test_env/lib/python3.7/site-packages/sqlalchemy/dialects/mssql/base.py", line 2444, in initialize
    self._setup_version_attributes()
  File "{HOME}/.conda/envs/test_env/lib/python3.7/site-packages/sqlalchemy/dialects/mssql/base.py", line 2458, in _setup_version_attributes
    if self.server_version_info[0] not in list(range(8, 17)):
IndexError: tuple index out of range

版本:

conda list -f sqlalchemy
# packages in environment at {HOME}/.conda/envs/test_env:
#
# Name                    Version                   Build  Channel
sqlalchemy                1.3.19           py37h7b6447c_0    anaconda

conda list -f pandas
# packages in environment at {HOME}/.conda/envs/test_env:
#
# Name                    Version                   Build  Channel
pandas                    1.1.3            py37he6710b0_0    anaconda

我希望有某种解决方案让我继续使用sqlalchemy.create_engine,因为多次调用pd.read_sqlpd.write_sql 需要它

【问题讨论】:

    标签: python sql-server sqlalchemy


    【解决方案1】:

    我最终使用的解决方法是将驱动程序切换到 Microsoft 提供的驱动程序:ODBC Driver 17 for SQL Server。如果您被 FreeTDS 卡住,并不能完全解决问题,但它可以解除对我的阻碍。

    例如

    import sqlalchemy
    DRIVER='ODBC Driver 17 for SQL Server'
    sqlalchemy.create_engine(f"mssql+pyodbc://{USER}:{PASS}@{DB_SERVER}/{DB_NAME}?driver={DRIVER}")
    

    示例odbcinst.ini:

    [ODBC Driver 17 for SQL Server]
    Description=Microsoft ODBC Driver 17 for SQL Server
    Driver=/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.5.so.2.1
    UsageCount=1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-24
      • 1970-01-01
      • 1970-01-01
      • 2019-02-23
      • 2021-10-27
      • 1970-01-01
      • 2015-02-11
      • 1970-01-01
      相关资源
      最近更新 更多