尝试连接到 MS SQL 服务器并出现 sql alchemy 抛出用户为空字符串的错误

Attempt to connect to MS SQL Server with sql alchemy throwing error that user is empty string

尝试使用 odbcsqlalchemy 连接到 MS SQL 服务器数据库以将 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 服务器读取时,相同的连接字符串在代码的较早部分成功运行,但在那种情况下使用 cnxn = pyodbc.connect(cnxn_str) 建立连接(这里也会这样做,但是根据 docs 如果我想写入 sqlite3 以外的任何东西,我需要使用 sqlalchemy。

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

努力去做in a more "SQL Alchemy" way:

# pyodbc
engine = sqlalchemy.create_engine('mssql+pyodbc://{}:{}@MyMSSQLServer'.format(username, password ))

# pymssql
engine = sqlalchemy.create_engine('mssql+pymssql://{}:{}@{}:{}/{}'.format(username, password, server, port, database))