PandasのDataFrameをSQLServerテーブルに書き込もうとしています。これが私の例です:
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 Server:Microsoft SQL Server 2012-11.0.2100.60(X64)2012年2月10日19:39:15 Copyright(c)Microsoft Corporation Standard Edition(64-bit)on Windows NT 6.2(Build 9200 :)
Python:3.4.3(v3.4.3:9b73f1c3e601、2015年2月24日、22:43:06)[MSC v.1600 32ビット(Intel)]
パンダバージョン:「0.16.2」
sqlalchemyバージョン: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; "
使用するODBC)と使用するODBCドライバー)の両方を指定する必要があります。
engine = sqlalchemy.create_engine('mssql+pyodbc://localhost/Sandbox?driver=SQL+Server+Native+Client+11.0')
信頼できる接続がデフォルトであるため、指定する必要はありませんが、指定する必要はありません。
考えられる問題は、ドライバーを指定していないことです。次のことを試してください。
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; "
Pyodbcの代わりにpymssqlを使用することもできますが、MSは後者を推奨していることに注意してください。
編集
DSN(データソース名)の有無にかかわらず接続する方法に関する公式ドキュメントは次のとおりです。
https://github.com/mkleehammer/pyodbc/blob/master/docs/index.md#connect-to-a-database