尝试使用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.connect(cnxn_str)
来建立连接(这里也会这样做) ,但根据docs我需要使用sqlalchemy,如果我想写除sqlite3以外的任何东西。)
任何人都可以解释为什么会发生这种情况以及如何解决这个问题?感谢。
答案 0 :(得分:1)
尝试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))