"No driver name specified" writing pandas data frame into SQL Server table

pandas, pyodbc, python, sql-server, sqlalchemy

Solution

You need to specify both that you want to use ODBC and what ODBC driver to use.

engine = sqlalchemy.create_engine('mssql+pyodbc://localhost/Sandbox?driver=SQL+Server+Native+Client+11.0')

Trusted connections are the default, so you don't need to specify that, although it shouldn't hurt to do so.

Update: 2022-02-18: The latest ODBC driver for SQL Server seems to be "ODBC Driver 17 for SQL Server". The driver named "SQL Server" is old and should not be used. @user1718097 gives the useful suggestion of using `[x for x in pyodbc.drivers()]` to list the installed drivers. You can also list the installed drivers with the `Get-OdbcDriver` cmdlet in powershell.

Problem

I am trying to write a Pandas' DataFrame into an SQL Server table. Here is my example: ``` import pyodbc import pandas as pd import sqlalchemy df = pd.DataFrame({'MDN': [242342342] }) engine = sqlalchemy.create_engine('mssql://localhost/Sandbox?trusted_connection=yes') df.to_sql('Test',engine, if_exists = 'append',index = False) ``` I am getting the following error message. Any thoughts on how to fix? ``` c:\python34\lib\site-packages\sqlalchemy\connectors\pyodbc.py:82: SAWarning: No driver name specified; this is expected by PyODBC when using DSN-less connections "No driver name specified; " --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-25-78677a18ce2d> in <module>() 4 engine = sqlalchemy.create_engine('mssql://localhost/Sandbox?trusted_connection=yes') 5 ----> 6 df.to_sql('Test',engine, if_exists = 'append',index = False) 7 8 #cnxn.close() c:\python34\lib\site-packages\pandas\core\generic.py in to_sql(self, name, con, flavor, schema, if_exists, index, index_label, chunksize, dtype) 980 self, name, con, flavor=flavor, schema=schema, if_exists=if_exists, 981 index=index, index_label=index_label, chunksize=chunksize, --> 982 dtype=dtype) 983 984 def to_pickle(self, path): c:\python34\lib\site-packages\pandas\io\sql.py in to_sql(frame, name, con, flavor, schema, if_exists, index, index_label, chunksize, dtype) 547 pandas_sql.to_sql(frame, name, if_exists=if_exists, index=index, 548 index_label=index_label, schema=schema, --> 549 chunksize=chunksize, dtype=dtype) 550 551 c:\python34\lib\site-packages\pandas\io\sql.py in to_sql(self, frame, name, if_exists, index, index_label, schema, chunksize, dtype) 1564 if_exists=if_exists, index_label=index_label, 1565 dtype=dtype) -> 1566 table.create() 1567 table.insert(chunksize) 1568 c:\python34\lib\site-packages\pandas\io\sql.py in create(self) 646 647 def create(self): --> 648 if self.exists(): 649 if self.if_exists == 'fail': 650 raise ValueError("Table '%s' already exists." % self.name) c:\python34\lib\site-packages\pandas\io\sql.py in exists(self) 634 635 def exists(self): --> 636 return self.pd_sql.has_table(self.name, self.schema) 637 638 def sql_schema(self): c:\python34\lib\site-packages\pandas\io\sql.py in has_table(self, name, schema) 1577 query = flavor_map.get(self.flavor) 1578 -> 1579 return len(self.execute(query, [name,]).fetchall()) > 0 1580 1581 def get_table(self, table_name, schema=None): c:\python34\lib\site-packages\pandas\io\sql.py in execute(self, *args, **kwargs) 1465 cur = self.con 1466 else: -> 1467 cur = self.con.cursor() 1468 try: 1469 if kwargs: AttributeError: 'Engine' object has no attribute 'cursor' ``` Also, is there ways to write connection string for `create_engine` differently? I would love to write it in form of a dictionary rather than a string. Update: Here is my new environment: MS SQL Server: Microsoft SQL Server 2012 - 11.0.2100.60 (X64) Feb 10 2012 19:39:15 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.2 (Build 9200: ) Python: 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)] Pandas version: '0.16.2' sqlalchemy version: 1.1.3 Jupyter server version : 4.2.3 Now the line ``` engine = sqlalchemy.create_engine('mssql+pyodbc://localhost/Sandbox?trusted_connection=yes') ``` generates the following error: ``` c:\python34\lib\site-packages\sqlalchemy\connectors\pyodbc.py:82: SAWarning: No driver name specified; this is expected by PyODBC when using DSN-less connections "No driver name specified; " ```

Original source

Related problems