2017-04-25 5 views
1

私は 'pandas.read_sql_query'を使用して、MS SQL Serverからpandas DataFrameにデータをコピーしようとしています。私は私のSQLクエリで複数の結合を行う必要があります。結合される表は、同じサーバー上にありますが、異なるデータベースにあります。私がpandasに渡しているクエリは、MS SQL Server Management Studioの中でうまく動作します。 Jupyterノートで、私はそうのようなデータを照会しようとした(ちょうど2に簡略化されている事がクエリ自体を読みやすくするために参加し、一般的な名前が使用されている):MS SQL Serverでsqlalchemy + pyodbcと複数のデータベースを使用してpandas read_sql用のSQL錬金術接続を作成するにはどうすればいいですか?

import pandas as pd 
import sqlalchemy as sql 
import pyodbc 

server = '100.10.10.10' 
driver = 'SQL+Server+Native+Client+11.0' 
myQuery = '''SELECT first.Field1, second.Field2 
      FROM db1.schema.Table1 AS first 
      JOIN db2.schema.Table2 AS second 
      ON first.Id = second.FirstId 
      ''' 
engine = sql.create_engine('mssql+pyodbc://{}?driver={}'.format(server, driver)) 
df = pd.read_sql_query(myQuery, engine) 

これが機能しないとエラーを返します。

DBAPIError: (pyodbc.Error) ('IM010', '[IM010] [Microsoft][��������� ��������� ODBC] ������� ������� ��� ��������� ������ (0) (SQLDriverConnect)') 

すべてが、私はエンジンでデータベースを含め、コードの次のようなもの、と正常に動作しますので、問題は、データベースに関する情報が含まれていないエンジンであるようだ。

myQuery = 'select Field1 from schema.Table1' 
db = 'db1' 
engine = sql.create_engine('mssql+pyodbc://{}/{}?driver={}'.format(server, db, driver)) 
df = pd.read_sql_query(myQuery, engine) 

私はエンジン内のデータベースが含まれていますが、そのようなクエリに追加していない場合は、上記の合流でのコードのような休憩:

私はpandas.read_sql_query「SQL」を指定する必要がありますどのように
myQuery = 'select Field1 from db1.schema.Table1' 
engine = sql.create_engine('mssql+pyodbc://{}?driver={}'.format(server, 
driver)) 
df = pd.read_sql_query(myQuery, engine) 

と別のデータベースのテーブルを同じサーバーに結合する必要がある場合、この場合、 の 'con'パラメーターはありますか?

P.S.私は接続しているこのサーバーへの読み取りアクセス権しか持っていません。新しいテーブルやビューなどを作成することはできません。

更新日: MS SQL Serverのバージョンは2008 R2です。

アップデート2:(import文で、エンジンの両方)の代わりにpyodbcのpymssqlを使用します。私は、だから私は、回避策を発見したのPython 3.6とWindows 10.

+0

あなたのMS SQL Serverのバージョンは何ですか? – MaxU

+0

@MaxU 2008 R2です。 –

+0

'SQL + Server + Native + Client + 10.0'をドライバとして試してみてください... [関連する質問](http:// stackoverflow。//41729710/5741205) – MaxU

答えて

2

を使用しています。これにより、データベース名を使用してエンジンでエンジンを指定することなく、ジョインを構築できます。この場合、ドライバを指定する必要はありません。

pymssqlでまだサポートされていないPython 3.6を使用している場合は問題が発生する可能性がありますが、Python 3.6 hereの非公式のホイールがあります。それは私の質問をすることになっています。ここで

がpymssqlで動作するように再構築合流すると元のコードです:非公式の車輪用として

import pandas as pd 
import sqlalchemy as sql 
import pymssql 

server = '100.10.10.10' 
myQuery = '''SELECT first.Field1, second.Field2 
      FROM db1.schema.Table1 AS first 
      JOIN db2.schema.Table2 AS second 
      ON first.Id = second.FirstId''' 
engine = sql.create_engine('mssql+pymssql://{}'.format(server)) 
df = pd.read_sql_query(myQuery, engine) 

、あなたは私が上記与えたリンクからのPython 3.6用のファイルをダウンロードする必要があり、その後にcdダウンロードフォルダと実行pip install wheelsここで、 'wheels'はホイールファイルの名前です。

UPDATE:

実際に、あまりにもpyodbc使用することが可能です。私はこれがSQL Serverのセットアップではうまくいくかどうかはわかりませんが、エンジンのデータベースとして 'master'を設定した後はすべてがうまくいっています。結果のコードは次のようになります。

import pandas as pd 
import sqlalchemy as sql 
import pyodbc 

server = '100.10.10.10' 
driver = 'SQL+Server' 
db = 'master' 
myQuery = '''SELECT first.Field1, second.Field2 
      FROM db1.schema.Table1 AS first 
      JOIN db2.schema.Table2 AS second 
      ON first.Id = second.FirstId''' 
engine = sql.create_engine('mssql+pyodbc://{}/{}?driver={}'.format(server, db, driver)) 
df = pd.read_sql_query(myQuery, engine) 
関連する問題