diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2006-06-01 02:03:36 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2006-06-01 02:03:36 +0000 |
commit | 8b67ee61c749ed5638c91312875a88a207ef2da6 (patch) | |
tree | b739e9bf90ea46beb2654b027f14bdb67ce901ab /lib/sqlalchemy/engine/url.py | |
parent | c60b59868206da546fde1a64bd9c063ea0bd9e09 (diff) | |
download | sqlalchemy-8b67ee61c749ed5638c91312875a88a207ef2da6.tar.gz |
implemented query string support in db urls, gets sent to dialect **kwargs, [ticket:196]
Diffstat (limited to 'lib/sqlalchemy/engine/url.py')
-rw-r--r-- | lib/sqlalchemy/engine/url.py | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/lib/sqlalchemy/engine/url.py b/lib/sqlalchemy/engine/url.py index a4297f5db..5e04e1317 100644 --- a/lib/sqlalchemy/engine/url.py +++ b/lib/sqlalchemy/engine/url.py @@ -3,13 +3,14 @@ import cgi import sqlalchemy.exceptions as exceptions class URL(object): - def __init__(self, drivername, username=None, password=None, host=None, port=None, database=None): + def __init__(self, drivername, username=None, password=None, host=None, port=None, database=None, query=None): self.drivername = drivername self.username = username self.password = password self.host = host self.port = port self.database= database + self.query = query or {} def __str__(self): s = self.drivername + "://" if self.username is not None: @@ -23,6 +24,10 @@ class URL(object): s += ':' + self.port if self.database is not None: s += '/' + self.database + if len(self.query): + keys = self.query.keys() + keys.sort() + s += '?' + "&".join("%s=%s" % (k, self.query[k]) for k in keys) return s def get_module(self): return getattr(__import__('sqlalchemy.databases.%s' % self.drivername).databases, self.drivername) @@ -66,7 +71,13 @@ def _parse_rfc1738_args(name): m = pattern.match(name) if m is not None: (name, username, password, host, port, database) = m.group(1, 2, 3, 4, 5, 6) - opts = {'username':username,'password':password,'host':host,'port':port,'database':database} + if database is not None: + tokens = database.split(r"?", 2) + database = tokens[0] + query = (len(tokens) > 1 and dict( cgi.parse_qsl(tokens[1]) ) or None) + else: + query = None + opts = {'username':username,'password':password,'host':host,'port':port,'database':database, 'query':query} return URL(name, **opts) else: raise exceptions.ArgumentError("Could not parse rfc1738 URL from string '%s'" % name) |