Python 尝试使用SQL alchemy连接到MS SQL Server时抛出用户为空字符串的错误

Python 尝试使用SQL alchemy连接到MS SQL Server时抛出用户为空字符串的错误,python,pandas,sqlalchemy,pyodbc,Python,Pandas,Sqlalchemy,Pyodbc,尝试使用odbc和sqlalchemy连接到MS SQL Server数据库,以将pandas.DataFrame写入数据库,并在连接字符串中提供一个用户时得到一个错误,该错误似乎暗示正在使用的用户是空字符串。为什么会这样 相关的代码片段是: import sqlalchemy # setup db connection server = 'myserver' database = 'mydb' table = 'mytable' username = 'username' passwor

尝试使用odbc和sqlalchemy连接到MS SQL Server数据库,以将pandas.DataFrame写入数据库,并在连接字符串中提供一个用户时得到一个错误,该错误似乎暗示正在使用的用户是空字符串。为什么会这样

相关的代码片段是:

import sqlalchemy

# setup db connection
server = 'myserver' 
database = 'mydb'
table = 'mytable'
username = 'username' 
password = 'password' 
cnxn_str = 'DSN=MyMSSQLServer;DATABASE='+database+';UID='+username+';PWD='+password+';MultipleActiveResultSets=True;'

engine = sqlalchemy.create_engine("mssql+pyodbc:///?odbc_connect=%s" % cnxn_str)

# testing connection
cnxn = engine.connect()
...
抛出的简略错误消息为:

---------------------------------------------------------------------------
InterfaceError                            Traceback (most recent call last)
<ipython-input-207-6807f223c9bb> in <module>()
     15 
     16 #Sample select query
---> 17 cnxn = engine.connect()
     18 result = connection.execute("SELECT @@version;")
     19 for row in result:

/home/mapr/anaconda2/lib/python2.7/site-packages/sqlalchemy/engine/base.py in connect(self, **kwargs)
   2016         """
   2017 
-> 2018         return self._connection_cls(self, **kwargs)
   2019 
   2020     def contextual_connect(self, close_with_result=False, **kwargs):
...
...
/home/mapr/anaconda2/lib/python2.7/site-packages/sqlalchemy/engine/strategies.py in connect(connection_record)
     95                         if connection is not None:
     96                             return connection
---> 97                 return dialect.connect(*cargs, **cparams)
     98 
     99             creator = pop_kwarg('creator', connect)

/home/mapr/anaconda2/lib/python2.7/site-packages/sqlalchemy/engine/default.py in connect(self, *cargs, **cparams)
    383 
    384     def connect(self, *cargs, **cparams):
--> 385         return self.dbapi.connect(*cargs, **cparams)
    386 
    387     def create_connect_args(self, url):

InterfaceError: (pyodbc.InterfaceError) ('28000', u"[28000] [unixODBC][Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Login failed for user ''. (18456) (SQLDriverConnect)")
同样让我感到奇怪的是,在代码的早期,当使用同一个连接字符串从同一个sql server读取数据时,它可以成功地工作,但是在这种情况下,使用cnxn=pyodbc.connectcnxn_str来建立连接在这里也可以做同样的事情,但是根据下面的规则,如果我想写入sqlite3以外的任何东西,我需要使用sqlalchemy

有人能解释为什么会发生这种情况以及如何解决它吗?谢谢。

试试看:


谢谢,成功了。但是我已经在做的事情有什么问题吗?如果sql alchemy使用的是底层pyodbc,为什么在使用与直接调用pyodbc.connect相同的连接字符串时会出现问题?
# pyodbc
engine = sqlalchemy.create_engine('mssql+pyodbc://{}:{}@MyMSSQLServer'.format(username, password ))
# pymssql
engine = sqlalchemy.create_engine('mssql+pymssql://{}:{}@{}:{}/{}'.format(username, password, server, port, database))