2017-04-25 1 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) 
,691,363 (210)

하지만 엔진의 데이터베이스를 포함하지만과 같이 쿼리에 추가하지 않는 경우 위의 결합으로 코드 같은 휴식 :

나는 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. 연결하려는이 서버에 대한 읽기 액세스 권한 만 있습니다. 새 테이블이나 뷰 또는 이와 유사한 것을 만들 수는 없습니다.

업데이트 : MS SQL Server 버전은 2008 R2입니다.

업데이트 2 : (모두 가져 오기 문에서 엔진에서) 사용 pymssql 대신 pyodbc : 나는 파이썬 3.6 및 Windows 10

+0

MS SQL Server 버전은 무엇입니까? – MaxU

+0

@MaxU 2008 R2입니다. –

+0

'SQL + Server + Native + Client + 10.0'을 드라이버로 사용해보십시오 ... [관련 질문] (http : // stackoverflow.com/a/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) 

, 당신은 내가 위에서 준 링크, CD까지 파이썬 3.6에 대한 파일을 다운로드해야 다운로드 폴더 및 실행 pip install wheels 여기서 'wheels'는 휠 파일의 이름입니다.

UPDATE :

사실, 너무 pyodbc 사용할 수 있습니다. 이 SQL Server 설치 프로그램에 대해 작동해야하는지 모르겠지만, 엔진에 내 데이터베이스로 '마스터'를 설정 한 후에 모든 것이 나를 위해 일했습니다. 결과 코드는 다음과 같습니다.

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) 
관련 문제