2009-09-14 132 views
15

我正在使用SQLalchemy作爲Python項目,並且希望有一個整潔的連接字符串來訪問我的數據庫。例如:當密碼包含特殊字符時編寫連接字符串

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

問題是我的密碼包含一系列特殊字符,當我嘗試連接時,它們會被解釋爲分隔符。

我知道我可以只創建一個對象,然後通過我的憑據是這樣的:

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

但我寧願使用一個連接字符串,如果這是可能的。

所以要清楚,是否可以編碼我的連接字符串,或連接字符串的密碼部分 - 以便它可以正確解析?

+0

你能舉出一個不能被反斜線轉義的特殊字符的例子嗎? – tuergeist 2009-09-14 20:55:12

+0

在連接信息 – KeyboardInterrupt 2009-09-14 21:11:17

+0

中「X6〜k9?q」之後缺少「=」,無論我是否逃脫 – KeyboardInterrupt 2009-09-14 21:12:33

回答

30

對於URL組件字符串,反斜槓不是有效的轉義字符。你需要URL編碼,連接字符串的密碼部分:

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

如果你看一下在SQLAlchemy中用來表示數據庫連接的URL(在sqlalchemy/engine/url.py)類的實現,你可以看到,他們所使用的在將URL實例轉換爲字符串時使用相同的方法來轉義密碼,並且解析代碼使用互補的urllib.unquote_plus函數從連接字符串中提取密碼。

+0

是的,urlencoding的需要什麼。 – 2009-09-14 21:31:45

+7

在Python 3中'urllib.quote_plus'不存在,您可以使用['urllib.parse.quote_plus'](https://docs.python.org/3.1/library/urllib.parse.html#urllib。 parse.quote_plus)。 – agold 2016-11-02 14:35:26