【问题标题】:sqlalchemy with Typeerror but pyodbc works带有 Typeerror 的 sqlalchemy 但 pyodbc 有效
【发布时间】:2020-04-07 09:03:22
【问题描述】:

我尝试了多种使用 sql alchemy 连接到 MSSQL 的方法,但总是得到以下错误:

Traceback (most recent call last):
  File "<ipython-input-100-71745b407575>", line 1, in <module>
    conn = engine.connect()
  File "C:\Users\wantai1\AppData\Roaming\Python\Python37\site-packages\sqlalchemy\engine\base.py", line 2473, in connect
    return self._connection_cls(self, **kwargs)
  File "C:\Users\wantai1\AppData\Roaming\Python\Python37\site-packages\sqlalchemy\engine\base.py", line 878, in __init__
    self.__connection = connection or engine.raw_connection()
  File "C:\Users\wantai1\AppData\Roaming\Python\Python37\site-packages\sqlalchemy\engine\base.py", line 2559, in raw_connection
    return self.pool.unique_connection()
  File "C:\Users\wantai1\AppData\Roaming\Python\Python37\site-packages\sqlalchemy\pool.py", line 184, in unique_connection
    return _ConnectionFairy(self).checkout()
  File "C:\Users\wantai1\AppData\Roaming\Python\Python37\site-packages\sqlalchemy\pool.py", line 401, in __init__
    rec = self._connection_record = pool._do_get()
  File "C:\Users\wantai1\AppData\Roaming\Python\Python37\site-packages\sqlalchemy\pool.py", line 746, in _do_get
    con = self._create_connection()
  File "C:\Users\wantai1\AppData\Roaming\Python\Python37\site-packages\sqlalchemy\pool.py", line 189, in _create_connection
    return _ConnectionRecord(self)
  File "C:\Users\wantai1\AppData\Roaming\Python\Python37\site-packages\sqlalchemy\pool.py", line 287, in __init__
    exec_once(self.connection, self)
  File "C:\Users\wantai1\AppData\Roaming\Python\Python37\site-packages\sqlalchemy\event.py", line 377, in exec_once
    self(*args, **kw)
  File "C:\Users\wantai1\AppData\Roaming\Python\Python37\site-packages\sqlalchemy\event.py", line 386, in __call__
    fn(*args, **kw)
  File "C:\Users\wantai1\AppData\Roaming\Python\Python37\site-packages\sqlalchemy\engine\strategies.py", line 168, in first_connect
    dialect.initialize(c)
  File "C:\Users\wantai1\AppData\Roaming\Python\Python37\site-packages\sqlalchemy\connectors\pyodbc.py", line 135, in initialize
    super(PyODBCConnector, self).initialize(connection)
  File "C:\Users\wantai1\AppData\Roaming\Python\Python37\site-packages\sqlalchemy\dialects\mssql\base.py", line 1164, in initialize
    super(MSDialect, self).initialize(connection)
  File "C:\Users\wantai1\AppData\Roaming\Python\Python37\site-packages\sqlalchemy\engine\default.py", line 177, in initialize
    self._get_default_schema_name(connection)
  File "C:\Users\wantai1\AppData\Roaming\Python\Python37\site-packages\sqlalchemy\dialects\mssql\base.py", line 1180, in _get_default_schema_name
    user_name = connection.scalar("SELECT user_name() as user_name;")
  File "C:\Users\wantai1\AppData\Roaming\Python\Python37\site-packages\sqlalchemy\engine\base.py", line 1383, in scalar
    return self.execute(object, *multiparams, **params).scalar()
  File "C:\Users\wantai1\AppData\Roaming\Python\Python37\site-packages\sqlalchemy\engine\base.py", line 1449, in execute
    params)
  File "C:\Users\wantai1\AppData\Roaming\Python\Python37\site-packages\sqlalchemy\engine\base.py", line 1628, in _execute_text
    statement, parameters
  File "C:\Users\wantai1\AppData\Roaming\Python\Python37\site-packages\sqlalchemy\engine\base.py", line 1691, in _execute_context
    context)
  File "C:\Users\wantai1\AppData\Roaming\Python\Python37\site-packages\sqlalchemy\engine\default.py", line 333, in do_execute
    cursor.execute(statement, parameters)
TypeError: The first argument to execute must be a string or unicode query.

这是我的代码

import sqlalchemy as sa
import pyodbc
engine =sa.create_engine('mssql+pyodbc://uid:pwd@AWS1DNA01/xxx_Database,driver = SQL+Server')
conn = engine.connect()

此外,我尝试按照文档建议传递参数并得到相同的错误。

conn_string = urllib.parse.quote_plus("Driver={SQL Server}; Server=AWS1DNA01; Database=xxx_Database; Integrated Security=False;UID=uid;PWD=pwd")
engine = sa.create_engine('mssql+pyodbc:///?odbc_connect={}'.format(conn_string))
conn = engine.connect()

这个错误是什么意思,我该如何解决? 另外,我尝试使用 pyodbc 进行连接,并且可以正常工作:

conn_string = "Driver={SQL Server}; Server=AWS1DNA01; Database=xxx_Database; Integrated Security=False;UID=uid;PWD=pwd"
connection = pyodbc.connect(conn_string)

有人可以帮忙吗?

【问题讨论】:

  • this sqlalchemy docs entry 可能会有所帮助
  • @IljaEverilä 我已经添加了完整的回溯。但是,我无法将其格式化为代码,因为 stackoverflow 认为我有太多代码。
  • @AzatIbrakov 嗨 Azat,我已经尝试过传递方法,它返回了相同的错误。
  • 您是否尝试过像文档中那样将参数插入到 URL 字符串中?
  • 你使用的是什么版本的 SQLAlchemy 和 pyodbc?

标签: python sqlalchemy pyodbc


【解决方案1】:

我终于解决了这个问题,虽然我仍然不知道原来问题的原因。我没有使用 pyodbc,而是使用 pymssql 创建引擎,它可以工作。

engine = sa.create_engine('mssql+pymssql://uid:pdw@server/db?')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 2022-11-19
    • 2015-04-25
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多