Conectándose a SQL Server 2012 usando sqlalchemy y pyodbc

Estoy intentando conectarme a una base de datos de SQL Server 2012 usando SQLAlchemy (con pyodbc) en Python 3.3 (Windows 7-64-bit). Soy capaz de conectarme usando pyodbc directo pero no he podido conectarme utilizando SQLAlchemy. Tengo la configuración del archivo dsn para el acceso a la base de datos.

Me conecto con éxito usando pyodbc recto como este:

con = pyodbc.connect('FILEDSN=c:\\users\\me\\mydbserver.dsn') 

Para sqlalchemy he intentado:

 import sqlalchemy as sa engine = sa.create_engine('mssql+pyodbc://c/users/me/mydbserver.dsn/mydbname') 

El método create_engine no configura realmente la conexión y tiene éxito, pero si bash algo que hace que sqlalchemy realmente configure la conexión (como engine.table_names() ), toma un tiempo pero luego devuelve este error:

DBAPIError: (Error) ('08001', '[08001] [Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server does not exist or access denied. (17) (SQLDriverConnect)') None None

No estoy seguro de que las cosas vayan mal son cómo ver qué cadena de conexión se está pasando realmente a pyodbc por sqlalchemy. He utilizado con éxito las mismas clases de sqlalchemy con SQLite y MySQL.

¡Gracias por adelantado!

SQLAlchemy interpreta la cadena DSN basada en archivos como nombre de servidor = c , nombre de base de datos = users .

Prefiero conectarme sin usar DSN, es una tarea de configuración menos que tratar durante las migraciones de código.

Esta syntax funciona usando la autenticación de Windows:

 engine = sa.create_engine('mssql+pyodbc://server/database') 

O con la autenticación SQL:

 engine = sa.create_engine('mssql+pyodbc://user:password@server/database') 

SQLAlchemy tiene una explicación detallada de las diferentes opciones de cadenas de conexión aquí .

Tengo una información actualizada sobre la conexión al servidor MSSQL sin usar DSN y con la autenticación de Windows. En mi ejemplo, tengo las siguientes opciones: el nombre de mi servidor local es “(localdb) \ ProjectsV12”. El nombre del servidor local que veo en las propiedades de la base de datos (estoy usando Windows 10 / Visual Studio 2015). Mi nombre de db es “MainTest1”

 engine = create_engine('mssql+pyodbc://(localdb)\ProjectsV12/MainTest1?driver=SQL+Server+Native+Client+11.0', echo=True) 

Es necesario especificar el controlador en conexión. Puede encontrar la versión de su cliente en:

panel de control> Sistemas y seguridad> Herramientas administrativas.> Fuentes de datos ODBC> pestaña DSN del sistema> Agregar

Busque en la versión del cliente nativo de SQL de la lista.

En Python 3 puede usar la función quote_plus del módulo urllib.parse para crear parámetros para la conexión:

 import urllib params = urllib.parse.quote_plus("DRIVER={SQL Server Native Client 11.0};" "SERVER=dagger;" "DATABASE=test;" "UID=user;" "PWD=password") engine = sa.create_engine("mssql+pyodbc:///?odbc_connect={}".format(params)) 

Para utilizar la autenticación de Windows, desea utilizar Trusted_Connection como parámetro:

 params = urllib.parse.quote_plus("DRIVER={SQL Server Native Client 11.0};" "SERVER=dagger;" "DATABASE=test;" "Trusted_Connection=yes") 

En Python 2 debes usar la función quote_plus de la biblioteca urllib en urllib lugar:

 params = urllib.quote_plus("DRIVER={SQL Server Native Client 11.0};" "SERVER=dagger;" "DATABASE=test;" "UID=user;" "PWD=password") 

Solo desea agregar información más reciente aquí: si se está conectando mediante conexiones DSN:

 engine = create_engine("mssql+pyodbc://USERNAME:PASSWORD@SOME_DSN") 

Si se está conectando utilizando conexiones de nombre de host:

 engine = create_engine("mssql+pyodbc://USERNAME:PASSWORD@HOST_IP:PORT/DATABASENAME?driver=SQL+Server+Native+Client+11.0") 

Para más detalles, consulte el “Documento Oficial”