“未指定驱动程序名称”将Pandas数据框写入SQL Server表

vyu0f0g1  于 2023-01-01  发布在  SQL Server
关注(0)|答案(4)|浏览(252)

我正在尝试将一个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的连接字符串?我想用字典的形式而不是字符串的形式来编写它。

更新:以下是我的新环境:

MS SQL服务器:Microsoft SQL Server 2012 - 11.0.2100.60(X64)2012年2月10日19:39:15版权所有(c)基于Windows NT 6.2(内部版本号9200:)
Python:3.4.3(版本3.4.3:9 b73 f1 c3 e601,2015年2月24日,22:43:06)[MSC v.1600 32位(英特尔)]
Pandas版:'0.16.2'
SQL炼金术版本: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; "
wlsrxk51

wlsrxk511#

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

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

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

    • 更新日期:**

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

0yg35tkg

0yg35tkg2#

可能的问题是您尚未指定驱动程序,因此请尝试:

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

注意,您也可以使用pymssql代替pyodbc,但是MS推荐使用后者。
编辑
以下是有关如何使用/不使用DSN(数据源名称)进行连接的官方文档:
https://github.com/mkleehammer/pyodbc/blob/master/docs/index.md#connect-to-a-database

g52tjvyc

g52tjvyc3#

我知道这个问题已经回答了一段时间了,这只是一个警告,但如果你已经正确地转移了一切,这个错误仍然发生,这是恼人的。
对于那些像我一样不得不为之奋斗的人来说,你也可以直接在脚本中输入驱动程序,Pyodbc.py提供了这样的可能性(第26 - 28行):

# for non-DSN connections, this *may* be used to
    # hold the desired driver name
    pyodbc_driver_name = 'ODBC Driver 17 for SQL Server'
ccrfmcuu

ccrfmcuu4#

上面的信息非常有用。下面是我的综合版本,可以帮助新手在搜索。

using library panda和pyodbc -如果没有,请使用pip install命令安装基于版本的库。这里使用的Python版本是3.7.8

import pandas as pd
from sqlalchemy import create_engine
import pyodbc
 
  
#This query will work for sql authentication
def mssql_engine():
    engine = create_engine('mssql+pyodbc://type_username:type_password@type_servername_or_localhostname/type_database_name?driver=SQL+Server+Native+Client+11.0')
    return engine

#This query will for windows authentication 
#Note: Uncomment below code for windows authentication
#def mssql_engine():
      #engine = create_engine('mssql+pyodbc://localhostname/db_name?driver=SQL+Server+Native+Client+11.0')
      #return engine
   
 
query = 'select * from table_name'
#using pandas to read from sql and passing connection string as function
df = pd.read_sql(query, mssql_engine() ) 

#printing result
print(df)

相关问题