ProgrammingError raised with pyodbc 4.0.5 + MSSQL 2012

Issue #3910 resolved
kyk created an issue

When pyodbc is upgraded from 4.0.3 to 4.0.5, below error occurred with SQLAlchemy.

With pyodbc 4.0.3, sample code works well.

With "ODBC Driver 13 for SQL Server", same error occurred.

ODBC error 42000 is "Syntax error or access violation".

"SELECT schema_name()" state works well in SQL management studio and return "dbo".

  • Windwos 8.1 64bit, Python 2.7.13 32bit, SQLAlchemy 1.1.5, pyodbc 4.0.5, MSSQL 2012
  • sample code
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#-------------------------------------------------------------------------------
import urllib
from sqlalchemy import create_engine, MetaData
#-------------------------------------------------------------------------------
def test_autoload():
    odbcdrv = urllib.quote_plus("ODBC Driver 11 for SQL Server")
    engine = create_engine(
        "mssql+pyodbc://id:pw@ip:1433/db?driver={0}".format(odbcdrv),
        echo=True
    )
    conn = engine.connect()

    metadata = MetaData(engine)
    metadata.reflect(engine)
#-------------------------------------------------------------------------------
if __name__ == "__main__":
    test_autoload()
  • error message
2017-02-13 16:51:30,203 INFO sqlalchemy.engine.base.Engine SELECT  SERVERPROPERTY('ProductVersion')
2017-02-13 16:51:30,203 INFO sqlalchemy.engine.base.Engine ()
2017-02-13 16:51:30,203 INFO sqlalchemy.engine.base.Engine SELECT schema_name()
2017-02-13 16:51:30,204 INFO sqlalchemy.engine.base.Engine ()
Traceback (most recent call last):
  File "testsqlalchemy_pyodbc.py", line 19, in <module>
    test_autoload()
  File "testsqlalchemy_pyodbc.py", line 13, in test_autoload
    conn = engine.connect()
  File "C:\devtool\py27x86\lib\site-packages\sqlalchemy\engine\base.py", line 2082, in connect
    return self._connection_cls(self, **kwargs)
  File "C:\devtool\py27x86\lib\site-packages\sqlalchemy\engine\base.py", line 90, in __init__
    if connection is not None else engine.raw_connection()
  File "C:\devtool\py27x86\lib\site-packages\sqlalchemy\engine\base.py", line 2168, in raw_connection
    self.pool.unique_connection, _connection)
  File "C:\devtool\py27x86\lib\site-packages\sqlalchemy\engine\base.py", line 2138, in _wrap_pool_connect
    return fn()
  File "C:\devtool\py27x86\lib\site-packages\sqlalchemy\pool.py", line 328, in unique_connection
    return _ConnectionFairy._checkout(self)
  File "C:\devtool\py27x86\lib\site-packages\sqlalchemy\pool.py", line 766, in _checkout
    fairy = _ConnectionRecord.checkout(pool)
  File "C:\devtool\py27x86\lib\site-packages\sqlalchemy\pool.py", line 516, in checkout
    rec = pool._do_get()
  File "C:\devtool\py27x86\lib\site-packages\sqlalchemy\pool.py", line 1138, in _do_get
    self._dec_overflow()
  File "C:\devtool\py27x86\lib\site-packages\sqlalchemy\util\langhelpers.py", line 60, in __exit__
    compat.reraise(exc_type, exc_value, exc_tb)
  File "C:\devtool\py27x86\lib\site-packages\sqlalchemy\pool.py", line 1135, in _do_get
    return self._create_connection()
  File "C:\devtool\py27x86\lib\site-packages\sqlalchemy\pool.py", line 333, in _create_connection
    return _ConnectionRecord(self)
  File "C:\devtool\py27x86\lib\site-packages\sqlalchemy\pool.py", line 461, in __init__
    self.__connect(first_connect_check=True)
  File "C:\devtool\py27x86\lib\site-packages\sqlalchemy\pool.py", line 661, in __connect
    exec_once(self.connection, self)
  File "C:\devtool\py27x86\lib\site-packages\sqlalchemy\event\attr.py", line 246, in exec_once
    self(*args, **kw)
  File "C:\devtool\py27x86\lib\site-packages\sqlalchemy\event\attr.py", line 256, in __call__
    fn(*args, **kw)
  File "C:\devtool\py27x86\lib\site-packages\sqlalchemy\util\langhelpers.py", line 1321, in go
    return once_fn(*arg, **kw)
  File "C:\devtool\py27x86\lib\site-packages\sqlalchemy\engine\strategies.py", line 181, in first_connect
    dialect.initialize(c)
  File "C:\devtool\py27x86\lib\site-packages\sqlalchemy\connectors\pyodbc.py", line 165, in initialize
    super(PyODBCConnector, self).initialize(connection)
  File "C:\devtool\py27x86\lib\site-packages\sqlalchemy\dialects\mssql\base.py", line 1705, in initialize
    super(MSDialect, self).initialize(connection)
  File "C:\devtool\py27x86\lib\site-packages\sqlalchemy\engine\default.py", line 250, in initialize
    self._get_default_schema_name(connection)
  File "C:\devtool\py27x86\lib\site-packages\sqlalchemy\dialects\mssql\base.py", line 1736, in _get_default_schema_name
    default_schema_name = connection.scalar(query)
  File "C:\devtool\py27x86\lib\site-packages\sqlalchemy\engine\base.py", line 877, in scalar
    return self.execute(object, *multiparams, **params).scalar()
  File "C:\devtool\py27x86\lib\site-packages\sqlalchemy\engine\base.py", line 945, in execute
    return meth(self, multiparams, params)
  File "C:\devtool\py27x86\lib\site-packages\sqlalchemy\sql\elements.py", line 263, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
  File "C:\devtool\py27x86\lib\site-packages\sqlalchemy\engine\base.py", line 1053, in _execute_clauseelement
    compiled_sql, distilled_params
  File "C:\devtool\py27x86\lib\site-packages\sqlalchemy\engine\base.py", line 1189, in _execute_context
    context)
  File "C:\devtool\py27x86\lib\site-packages\sqlalchemy\engine\base.py", line 1393, in _handle_dbapi_exception
    exc_info
  File "C:\devtool\py27x86\lib\site-packages\sqlalchemy\util\compat.py", line 203, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=cause)
  File "C:\devtool\py27x86\lib\site-packages\sqlalchemy\engine\base.py", line 1182, in _execute_context
    context)
  File "C:\devtool\py27x86\lib\site-packages\sqlalchemy\engine\default.py", line 470, in do_execute
    cursor.execute(statement, parameters)
sqlalchemy.exc.ProgrammingError: (pyodbc.ProgrammingError) ('42000', "[42000] [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]'0x2700' \xb1\xd9\xc3\xb3\xc0\xc7 \xb1\xb8\xb9\xae\xc0\xcc \xc0\xdf\xb8\xf8\xb5\xc7\xbe\xfa\xbd\xc0\xb4\xcf\xb4\xd9. (102) (SQLExecDirectW)") [SQL: u'SELECT schema_name()']

Comments (3)

  1. Mike Bayer repo owner

    It may be difficult for me to get a reproducer for this one, can you please try this:

    engine = create_engine(...)
    engine.dialect.supports_unicode_statements = True
    

    Additionally, can you try a pyodbc-standalone script:

    import pyodbc
    conn = pyodbc.connect("uid=user;pwd=password;server=hostname,port;database=dbname;driver=drivername")
    cursor = conn.cursor()
    cursor.execute("SELECT schema_name()")
    cursor.execute(u"SELECT schema_name()")
    
  2. Log in to comment