2009-09-14 28 views
15

पर एक कनेक्शन स्ट्रिंग लिखना मैं एक पायथन परियोजना के लिए SQLalchemy का उपयोग कर रहा हूं, और मैं अपने डेटाबेस तक पहुंचने के लिए एक साफ कनेक्शन स्ट्रिंग रखना चाहता हूं। उदाहरण के लिए:पासवर्ड के विशेष वर्ण

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

समस्या अपना पासवर्ड विशेष वर्ण जब मैं कनेक्ट करने का प्रयास है कि सीमांकक के रूप में व्याख्या करने के का एक क्रम होता है।

मुझे लगता है मैं सिर्फ इस तरह एक वस्तु बना सकते हैं और उसके बाद से पारित अपनी उपलब्धियों को एहसास:

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

लेकिन मैं बहुत बल्कि एक कनेक्शन स्ट्रिंग का उपयोग करते हैं यह संभव है।

तो स्पष्ट होने के लिए, क्या मेरे कनेक्शन स्ट्रिंग को एन्कोड करना संभव है, या कनेक्शन स्ट्रिंग का पासवर्ड भाग - ताकि इसे ठीक से पार्स किया जा सके?

+0

क्या आप इस विशेष चार का उदाहरण दे सकते हैं जो बैकस्लैश से बच नहीं सकता है? – tuergeist

+0

कनेक्शन जानकारी – KeyboardInterrupt

+0

में "X6 ~ k9? Q" के बाद "=" गायब है, जो होता है कि मैं इसे से बचता हूं या नहीं – KeyboardInterrupt

उत्तर

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 में इस्तेमाल किया डेटाबेस कनेक्शन यूआरएल (sqlalchemy/engine/url.py में) का प्रतिनिधित्व करने के कार्यान्वयन को देखें, तो आप देख सकते हैं कि वे का उपयोग URL उदाहरणों को तारों में परिवर्तित करते समय पासवर्ड से बचने के लिए एक ही विधि, और पार्सिंग कोड कनेक्शन स्ट्रिंग से पासवर्ड निकालने के लिए पूरक urllib.unquote_plus फ़ंक्शन का उपयोग करता है।

+0

हाँ, urlencoding की क्या ज़रूरत है। –

+7

पायथन 3 'urllib.quote_plus' में मौजूद नहीं है, और इसके बजाय आप ['urllib.parse.quote_plus'] (https://docs.python.org/3.1/library/urllib.parse.html#urllib का उपयोग कर सकते हैं। parse.quote_plus)। – agold

संबंधित मुद्दे