python - "No driver name specified"将 pandas 数据框写入 SQL Server 表

标签 python sql-server pandas sqlalchemy pyodbc

我正在尝试将 Pandas 的 DataFrame 写入 SQL Server 表中。这是我的例子:

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)

我收到以下错误消息。关于如何修复的任何想法?

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'

还有,有没有办法以不同的方式为 create_engine 编写连接字符串?我很乐意以字典的形式而不是字符串的形式来编写它。

更新:这是我的新环境:

微软 SQL 服务器:微软 SQL 服务器 2012 - 11.0.2100.60 (X64) 2012 年 2 月 10 日 19:39:15 版权所有 (c) 微软公司 Windows NT 6.2(内部版本 9200:)上的标准版(64 位)

Python:3.4.3(v3.4.3:9b73f1c3e601,2015 年 2 月 24 日,22:43:06)[MSC v.1600 32 位(英特尔)]

Pandas 版本:'0.16.2'

sqlalchemy 版本:1.1.3

Jupyter 服务器版本:4.2.3

现在行

engine = sqlalchemy.create_engine('mssql+pyodbc://localhost/Sandbox?trusted_connection=yes')

生成以下错误:

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; "

最佳答案

您需要指定要使用 ODBC 以及要使用的 ODBC 驱动程序。

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

可信连接是默认设置,因此您无需指定它,尽管这样做不会有什么坏处。

更新:
2022-02-18:SQL Server 的最新 ODBC 驱动程序似乎是“SQL Server 的 ODBC 驱动程序 17”。名为“SQL Server”的驱动程序是旧的,不应使用。
@user1718097 给出了有用的建议,即使用 [x for x in pyodbc.drivers()] 列出已安装的驱动程序。 您还可以在 powershell 中使用 Get-OdbcDriver cmdlet 列出已安装的驱动程序。

关于python - "No driver name specified"将 pandas 数据框写入 SQL Server 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40332319/

相关文章:

python - 为什么sklearn隔离森林预测错误?

c# - 这是否容易受到注入(inject)攻击

sql-server - 如何在UBUNTU上安装SQL Server Native Client 11.0?

python - 嵌套元组列表的高级排序标准

java - 如何使用TCP套接字在Java和Python之间持续通信

sql - 类似的 MS SQL 模式

python - 如何在 Pandas Column 中高效创建 "others"类别?

python - 贬低 pandas DataFrame 的列值

python - Pandas 尝试向数据帧追加一行,但不断覆盖现有行

python - 如何压缩无限范围的迭代器?