2017-12-08 27 views
0

odbcsqlalchemyでMS SQL Serverデータベースに接続しようとすると、pandas.DataFrameをデータベースに書き込んで、ユーザーは空の文字列(接続文字列が提供されている場合)です。これはなぜでしょうか?何も私には奇妙であることは、この同じ接続文字列は、以前では、正常に動作することであるMS SQL Serverに接続しようとしましたが、ユーザーが空文字列のエラーをスローしました

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

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() 
... 

とスロー(簡略)エラーメッセージは次のとおりです。

関連するコードスニペットです同じSQLサーバーから読み取るために使用されたコードですが、接続を確立するためにcnxn = pyodbc.connect(cnxn_str)を使用します(ここで同じことを行いますが、docsに従ってsqlalchemyを使用する必要があります。 3)。

これはなぜ起こっているのか、それを修正する方法を誰もが説明できますか?ありがとう。

答えて

0

それを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)) 
+0

働いたおかげで、。しかし、私がすでにやっていたことに何が間違っていたのですか? 'sql alchemy'が根本的な' pyodbc'を使っていた場合、 'pyodbc.connect()'への直接呼び出しと同じ接続文字列を使うとどうして問題がありましたか? – lampShadesDrifter