Conectando a un servidor SQL desde SQLAlchemy usando odbc_connect

Soy nuevo en Python y SQL Server. He intentado insertar un pandas df en nuestra base de datos durante los últimos 2 días sin suerte. ¿Alguien por favor puede ayudarme a depurar los errores.

He probado lo siguiente

import pyodbc from sqlalchemy import create_engine engine = create_engine('mssql+pyodbc:///?odbc_connect=DRIVER={SQL Server};SERVER=bidept;DATABASE=BIDB;UID=sdcc\neils;PWD=neil!pass') engine.connect() df.to_sql(name='[BIDB].[dbo].[Test]',con=engine, if_exists='append') 

Sin embargo, en la línea engine.connect () obtengo el siguiente error

 sqlalchemy.exc.DBAPIError: (pyodbc.Error) ('08001', '[08001] [Microsoft][ODBC SQL Server Driver]Neither DSN nor SERVER keyword supplied (0) (SQLDriverConnect)') 

¿Alguien puede decirme lo que me falta? Estoy usando Microsoft SQL Server Management Studio – 14.0.17177.0

Me conecto al servidor SQL a través de los siguientes

 Server type: Database Engine Server name: bidept Authentication: Windows Authentication for which I log into my windows using username : sdcc\neils and password : neil!pass 

También he intentado esto

 import pyodbc conn_str = ( r'Driver={SQL Server Native Client 11.0};' r'Server=bidept;' r'Database=BIDB;' r'Trusted_Connection=yes;' ) cnxn = pyodbc.connect(conn_str) df.to_sql(name='Test',con=cnxn, if_exists='append') 

por lo que tengo este error

 pandas.io.sql.DatabaseError: Execution failed on sql 'SELECT name FROM sqlite_master WHERE type='table' AND name=?;': ('42S02', "[42S02] [Microsoft][SQL Server Native Client 11.0][SQL Server]Invalid object name 'sqlite_master'. (208) (SQLExecDirectW); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]Statement(s) could not be prepared. (8180)") 

Cualquier ayuda sería muy apreciada ya que no tengo ni idea de qué hacer.

Como se indica en la documentación de SQLAlchemy , “los delimitadores deben ser URL escapados” cuando se utiliza una cadena pyodbc exacta de paso.

Entonces, esto fallará …

 import pyodbc from sqlalchemy import create_engine params = r'DRIVER={SQL Server};SERVER=.\SQLEXPRESS;DATABASE=myDb;Trusted_Connection=yes' conn_str = 'mssql+pyodbc:///?odbc_connect={}'.format(params) engine = create_engine(conn_str) 

… pero esto funcionará:

 import pyodbc from sqlalchemy import create_engine import urllib params = urllib.parse.quote_plus(r'DRIVER={SQL Server};SERVER=.\SQLEXPRESS;DATABASE=myDb;Trusted_Connection=yes') conn_str = 'mssql+pyodbc:///?odbc_connect={}'.format(params) engine = create_engine(conn_str)