Wie zum erstellen von sql-alchemy-Verbindung für pandas read_sql mit sqlalchemy+pyodbc und mehrere Datenbanken in MS SQL Server?
Ich versuche, mit 'pandas.read_sql_query' kopieren der Daten aus MS SQL Server in ein pandas DataFrame. Ich brauche mehrere joins in meiner SQL-Abfrage. Die Tabellen, die verbunden werden, sind auf dem gleichen server, aber in verschiedenen Datenbanken. Die Abfrage, die ich bin übergeben pandas funktioniert innerhalb MS SQL Server Management Studio. In einem Jupyter Notebook habe ich versucht, Daten abzufragen, wie so (um Dinge zu machen, lesbar der Abfrage selbst ist vereinfacht, um nur 2 verbindungen und generische Namen verwendet werden):
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)
Funktioniert dies nicht und gibt einen Fehler zurück:
DBAPIError: (pyodbc.Error) ('IM010', '[IM010] [Microsoft][��������� ��������� ODBC] ������� ������� ��� ��������� ������ (0) (SQLDriverConnect)')
Es scheint, dass das problem in der engine, die nicht enthalten Informationen über die Datenbank, da funktioniert alles einwandfrei mit der nächsten Art von code, wo ich die Datenbank in die engine:
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)
aber bricht wie der code mit joins oben, wenn ich nicht zählen-Datenbank in die engine, aber hinzufügen, um die Abfrage in etwa so:
myQuery = 'select Field1 from db1.schema.Table1'
engine = sql.create_engine('mssql+pyodbc://{}?driver={}'.format(server,
driver))
df = pd.read_sql_query(myQuery, engine)
So, wie soll ich angeben, die pandas.read_sql_query 'sql' und 'con' - Parameter im
in diesem Fall, wenn ich brauche, um join-Tabellen aus verschiedenen Datenbanken, aber die gleichen server?
P. S. ich habe nur-lese-Zugriff auf diesen server bin ich verbunden wird. Ich kann nicht erstellen Sie neue Tabellen oder Ansichten oder so etwas.
Update:
Die MS SQL Server version 2008 R2.
Update 2: ich bin mit Python 3.6 und Windows 10.
- was ist deine MS SQL Server version?
- Es ist 2008 R2.
- Versuchen
SQL+Server+Native+Client+10.0
als Fahrer... Fragen - Ich habe gerade versucht zu tun, was Sie vorgeschlagen. Das Ergebnis ist das gleiche. Darüber hinaus, diese änderung in der Treiber-breakes den funktionierenden code die angegebene Datenbank in die engine. Es gibt eine ähnliche Fehlermeldung, mit Ausnahme der 'IM010' in der Fehlermeldung, wechseln Sie in den 'IM002'.
- Ich habe auch versucht nur
SQL+Server
. Als Ergebnis der arbeiten code gearbeitet, aber das brechen code gibt einen Fehler zurück, mit 'IM002'. - möglicherweise möchten Sie überprüfen, dieser
- Sorry, ich verstehe nicht, wie diese helfen können.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Also ich habe eine Lösung: verwenden Sie pymssql statt pyodbc (sowohl in der import-Anweisung und im Motor). Es ermöglicht Ihnen das erstellen Sie Ihre Verknüpfungen mit Datenbank-Namen und ohne Angabe des Motors. Und es gibt keine Notwendigkeit, einen Treiber angeben, in diesem Fall.
Möglicherweise gibt es ein problem, wenn Sie mit Python 3.6 nicht unterstützt durch pymssql oficially noch nicht, aber Sie können finden, inoffizielle Räder für Ihre Python 3.6 hier. Es funktioniert wie soll mit meinen Abfragen.
Hier ist der original-code mit Verknüpfungen neu erstellt, um die Arbeit mit pymssql:
Als für die inoffizielle Räder, die Sie benötigen, um die Datei herunterzuladen für Python 3.6 aus dem link, den ich oben gab, dann cd in den download-Ordner und führen Sie
pip install wheels
wo 'Räder' ist der name der Räder Datei.UPDATE:
Tatsächlich, es ist möglich, pyodbc zu. Ich bin nicht sicher, ob diese Arbeit sollte für alle SQL Server-setup, aber hat alles geklappt bei mir, nachdem ich mich gesetzt hatte, 'master', als meine Datenbank in die engine. Der resultierende code würde wie folgt Aussehen: