2017-11-21 4 views
2

Ich bin neu in Python und SQL Server. Ich habe versucht, ein Pandas df in den letzten 2 Tagen ohne Glück in unsere Datenbank einzufügen. Kann mir bitte jemand helfen, die Fehler zu debuggen.Verbinden mit SQL Server von SQLAlchemy: "Weder DSN noch SERVER Schlüsselwort geliefert"

Ich habe versucht, die folgenden

import pyodbc 
from sqlalchemy import create_engine 

engine = create_engine('mssql+pyodbc:///?odbc_connect=DRIVER={SQL Server};SERVER=bidept;DATABASE=BIDB;UID=sdcc\neils;PWD=neil!pass') 
engine.connect() 
df.to_sql(name='[BIDB].[dbo].[Test]',con=engine, if_exists='append') 

jedoch am engine.connect() Zeile ich die folgende Störung erhalte mir

sqlalchemy.exc.DBAPIError: (pyodbc.Error) ('08001', '[08001] [Microsoft][ODBC SQL Server Driver]Neither DSN nor SERVER keyword supplied (0) (SQLDriverConnect)') 

Kann jemand sagen, was ich fehle. Ich bin mit Microsoft SQL Server Management Studio - 14.0.17177.0

ich auf den SQL-Server durch die folgenden

Server type: Database Engine 
Server name: bidept 
Authentication: Windows Authentication 

for which I log into my windows using username : sdcc\neils 
and password : neil!pass 

verbinden habe ich auch schon versucht, diesen

import pyodbc 

conn_str = (
    r'Driver={SQL Server Native Client 11.0};' 
    r'Server=bidept;' 
    r'Database=BIDB;' 
    r'Trusted_Connection=yes;' 
    ) 

cnxn = pyodbc.connect(conn_str) 

df.to_sql(name='Test',con=cnxn, if_exists='append') 

für die ich diesen Fehler bekam

pandas.io.sql.DatabaseError: Execution failed on sql 'SELECT name FROM sqlite_master WHERE type='table' AND name=?;': ('42S02', "[42S02] [Microsoft][SQL Server Native Client 11.0][SQL Server]Invalid object name 'sqlite_master'. (208) (SQLExecDirectW); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]Statement(s) could not be prepared. (8180)") 

Jede Hilfe würde sehr geschätzt werden, da ich keine Ahnung habe, was zu tun ist.

Antwort

3

Wie in der SQLAlchemy documentation, "Die Delimeter müssen URL maskiert sein", wenn Sie eine passgenau pyodbc Zeichenfolge verwenden.

Also, das wird scheitern ...

import pyodbc 
from sqlalchemy import create_engine 

params = r'DRIVER={SQL Server};SERVER=.\SQLEXPRESS;DATABASE=myDb;Trusted_Connection=yes' 
conn_str = 'mssql+pyodbc:///?odbc_connect={}'.format(params) 
engine = create_engine(conn_str) 

... aber das funktioniert:

import pyodbc 
from sqlalchemy import create_engine 
import urllib 

params = urllib.parse.quote_plus(r'DRIVER={SQL Server};SERVER=.\SQLEXPRESS;DATABASE=myDb;Trusted_Connection=yes') 
conn_str = 'mssql+pyodbc:///?odbc_connect={}'.format(params) 
engine = create_engine(conn_str) 
+1

funktionierts nicht auf Python 2.7? Auf 2.7 ist es nicht möglich, parse zu finden 'AttributError: 'Modul' Objekt hat kein Attribut 'parse'' konnte es auf Python 3.5 ausführen. Testen der .to_sql() (Es läuft seit den letzten 5 Minuten und stecken dort ... besorgt, wenn es abgeschlossen wird oder nicht) –

+2

Unter Python2 wäre es nur 'urllib.quote_plus'. –

+0

Dies funktionierte auf Python 3.5. Vielen Dank. Ich werde sehen, wie ich die Tabellen in regelmäßigen Abständen aktualisieren kann. Ich habe einen Fehler am Ende, aber ich kann die Tabelle Fehler sehen: 'C: \ ProgramData \ Anaconda3 \ lib \ Site-Pakete \ Pandas \ io \ sql.py: 1168: UserWarning: Der angegebene Tabellenname 'Test' ist nicht in der Datenbank nach dem Schreiben der Tabelle genau so gefunden wurde, möglicherweise aufgrund von Problemen mit der Groß- und Kleinschreibung. Erwägen Sie die Verwendung kleingeschriebener Tabellennamen. warnings.warn (msg, UserWarning) 'Auch die Tabelle, die erstellt wurde, war in [sdcc \ neils]. [Test] und nicht [dbo]. [Test] .... Kann mir jemand erklären, warum und was kann ich tun bekomme ich unter [dbo] –