sqlalchemy с Typeerror, но pyodb c работает - PullRequest
0 голосов
/ 06 апреля 2020

Я пробовал несколько способов подключения к MS SQL с sql алхимией, но всегда получаю ошибку ниже:

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()

Что означает эта ошибка и как ее исправить? Кроме того, я попытался использовать pyodb c для подключения, и это работает:

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

Может кто-нибудь, пожалуйста, помогите с этим?

1 Ответ

0 голосов
/ 07 апреля 2020

Я наконец исправил проблему, хотя до сих пор не знаю причину первоначальной проблемы. Вместо того, чтобы использовать pyodb c, я использовал pyms sql для создания движка, и он работает.

engine = sa.create_engine('mssql+pymssql://uid:pdw@server/db?')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...