2009-09-14 4 views
15

Ich verwende SQLalchemy für ein Python-Projekt und möchte eine saubere Verbindungszeichenfolge für den Zugriff auf meine Datenbank verwenden. So zum Beispiel:Schreiben einer Verbindungszeichenfolge, wenn das Kennwort Sonderzeichen enthält

engine = create_engine('postgres://user:[email protected]/database') 

Das Problem ist, mein Passwort eine Folge von Sonderzeichen enthält, die als Trennzeichen interpretiert werden, wenn ich versuche zu verbinden.

Ich weiß, ich könnte nur ein Objekt erstellen und dann meine Anmeldeinformationen wie folgt passieren:

drivername = 'postgres', 
username = 'user', 
password = 'pass', 
host  = 'host', 
database = 'database' 

Aber ich viel lieber eine Verbindungszeichenfolge verwenden würde, wenn dies möglich ist.

Also, um klar zu sein, ist es möglich, meine Verbindungszeichenfolge oder das Passwort Teil der Verbindungszeichenfolge zu verschlüsseln - so dass es richtig analysiert werden kann?

+0

Können Sie ein Beispiel für dieses spezielle Zeichen geben, das nicht durch einen Backslash ersetzt werden kann? – tuergeist

+0

fehlt "=" nach "X6 ~ k9? Q" in Verbindung info – KeyboardInterrupt

+0

das passiert, ob ich es entfliehen oder nicht – KeyboardInterrupt

Antwort

30

Backslashes sind keine gültigen Escape-Zeichen für URL-Komponentenzeichenfolgen. Sie müssen das Passwort Teil der Verbindungszeichenfolge URL-kodieren:

from urllib import quote_plus as urlquote 
from sqlalchemy.engine import create_engine 
engine = create_engine('postgres://user:%[email protected]/database' % urlquote('badpass')) 

Wenn Sie bei der Umsetzung der in SQLAlchemy verwendete Klasse aussehen Datenbankverbindung URLs (in sqlalchemy/engine/url.py) darstellen, können Sie sehen, dass sie die Verwendung dieselbe Methode, um Kennwörter beim Konvertieren der URL-Instanzen in Zeichenfolgen zu umgehen, und dass der Parsing-Code die komplementäre urllib.unquote_plus-Funktion verwendet, um das Kennwort aus einer Verbindungszeichenfolge zu extrahieren.

+0

Ja, urlencoding ist, was benötigt wird. –

+7

In Python 3 existiert 'urllib.quote_plus' nicht und stattdessen können Sie [' urllib.parse.quote_plus'] (https://docs.python.org/3.1/library/urllib.parse.html#urllib) verwenden. parse.quote_plus). – agold