summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r--lib/sqlalchemy/databases/access.py12
-rw-r--r--lib/sqlalchemy/databases/firebird.py2
-rw-r--r--lib/sqlalchemy/databases/mssql.py2
-rw-r--r--lib/sqlalchemy/databases/mysql.py3
-rw-r--r--lib/sqlalchemy/databases/postgres.py2
-rw-r--r--lib/sqlalchemy/engine/url.py82
6 files changed, 61 insertions, 42 deletions
diff --git a/lib/sqlalchemy/databases/access.py b/lib/sqlalchemy/databases/access.py
index 2d36049ed..7552b897d 100644
--- a/lib/sqlalchemy/databases/access.py
+++ b/lib/sqlalchemy/databases/access.py
@@ -202,14 +202,14 @@ class AccessDialect(default.DefaultDialect):
dbapi = classmethod(dbapi)
def create_connect_args(self, url):
- opts = url.translate_connect_args(['host', 'database', 'username', 'password', 'port'])
+ opts = url.translate_connect_args()
connectors = ["Driver={Microsoft Access Driver (*.mdb)}"]
connectors.append("Dbq=%s" % opts["database"])
- user = opts.get("user")
+ user = opts.get("username", None)
if user:
connectors.append("UID=%s" % user)
connectors.append("PWD=%s" % opts.get("password", ""))
- return [[";".join (connectors)], {}]
+ return [[";".join(connectors)], {}]
def create_execution_context(self, *args, **kwargs):
return AccessExecutionContext(self, *args, **kwargs)
@@ -273,8 +273,7 @@ class AccessDialect(default.DefaultDialect):
# A fresh DAO connection is opened for each reflection
# This is necessary, so we get the latest updates
- opts = connection.engine.url.translate_connect_args(['host', 'database', 'username', 'password', 'port'])
- dtbs = daoEngine.OpenDatabase(opts['database'])
+ dtbs = daoEngine.OpenDatabase(connection.engine.url.database)
try:
for tbl in dtbs.TableDefs:
@@ -340,8 +339,7 @@ class AccessDialect(default.DefaultDialect):
def table_names(self, connection, schema):
# A fresh DAO connection is opened for each reflection
# This is necessary, so we get the latest updates
- opts = connection.engine.url.translate_connect_args(['host', 'database', 'username', 'password', 'port'])
- dtbs = daoEngine.OpenDatabase(opts['database'])
+ dtbs = daoEngine.OpenDatabase(connection.engine.url.database)
names = [t.Name for t in dtbs.TableDefs if t.Name[:4] != "MSys" and t.Name[:4] <> "~TMP"]
dtbs.Close()
diff --git a/lib/sqlalchemy/databases/firebird.py b/lib/sqlalchemy/databases/firebird.py
index 2a9bbb5bd..a4262d9ca 100644
--- a/lib/sqlalchemy/databases/firebird.py
+++ b/lib/sqlalchemy/databases/firebird.py
@@ -116,7 +116,7 @@ class FBDialect(default.DefaultDialect):
dbapi = classmethod(dbapi)
def create_connect_args(self, url):
- opts = url.translate_connect_args(['host', 'database', 'user', 'password', 'port'])
+ opts = url.translate_connect_args(username='user')
if opts.get('port'):
opts['host'] = "%s/%s" % (opts['host'], opts['port'])
del opts['port']
diff --git a/lib/sqlalchemy/databases/mssql.py b/lib/sqlalchemy/databases/mssql.py
index 03b276d4a..8a23ce9a3 100644
--- a/lib/sqlalchemy/databases/mssql.py
+++ b/lib/sqlalchemy/databases/mssql.py
@@ -447,7 +447,7 @@ class MSSQLDialect(default.DefaultDialect):
dbapi = classmethod(dbapi)
def create_connect_args(self, url):
- opts = url.translate_connect_args(['host', 'database', 'user', 'password', 'port'])
+ opts = url.translate_connect_args(username='user')
opts.update(url.query)
if 'auto_identity_insert' in opts:
self.auto_identity_insert = bool(int(opts.pop('auto_identity_insert')))
diff --git a/lib/sqlalchemy/databases/mysql.py b/lib/sqlalchemy/databases/mysql.py
index af01cf84e..6d5c54578 100644
--- a/lib/sqlalchemy/databases/mysql.py
+++ b/lib/sqlalchemy/databases/mysql.py
@@ -1353,7 +1353,8 @@ class MySQLDialect(default.DefaultDialect):
dbapi = classmethod(dbapi)
def create_connect_args(self, url):
- opts = url.translate_connect_args(['host', 'db', 'user', 'passwd', 'port'])
+ opts = url.translate_connect_args(database='db', username='user',
+ password='passwd')
opts.update(url.query)
util.coerce_kw_type(opts, 'compress', bool)
diff --git a/lib/sqlalchemy/databases/postgres.py b/lib/sqlalchemy/databases/postgres.py
index e2876f1f8..eecdcebbd 100644
--- a/lib/sqlalchemy/databases/postgres.py
+++ b/lib/sqlalchemy/databases/postgres.py
@@ -240,7 +240,7 @@ class PGDialect(default.DefaultDialect):
dbapi = classmethod(dbapi)
def create_connect_args(self, url):
- opts = url.translate_connect_args(['host', 'database', 'user', 'password', 'port'])
+ opts = url.translate_connect_args(username='user')
if 'port' in opts:
opts['port'] = int(opts['port'])
opts.update(url.query)
diff --git a/lib/sqlalchemy/engine/url.py b/lib/sqlalchemy/engine/url.py
index 1f6f9eff4..a3487638c 100644
--- a/lib/sqlalchemy/engine/url.py
+++ b/lib/sqlalchemy/engine/url.py
@@ -101,24 +101,40 @@ class URL(object):
return dialect
raise ImportError('unknown database %r' % self.drivername)
- def translate_connect_args(self, names):
- """Translate attributes into a dictionary of connection arguments.
-
- Given a list of argument names corresponding to the URL
- attributes (`host`, `database`, `username`, `password`,
- `port`), will assemble the attribute values of this URL into
- the dictionary using the given names.
+ def translate_connect_args(self, names=[], **kw):
+ """Translate url attributes into a dictionary of connection arguments.
+
+ Returns attributes of this url (`host`, `database`, `username`,
+ `password`, `port`) as a plain dictionary. The attribute names are
+ used as the keys by default. Unset or false attributes are omitted
+ from the final dictionary.
+
+ \**kw
+ Optional, alternate key names for url attributes::
+
+ # return 'username' as 'user'
+ username='user'
+
+ # omit 'database'
+ database=None
+
+ names
+ Deprecated. A list of key names. Equivalent to the keyword
+ usage, must be provided in the order above.
"""
- a = {}
+ translated = {}
attribute_names = ['host', 'database', 'username', 'password', 'port']
- for n in names:
- sname = attribute_names.pop(0)
- if n is None:
- continue
- if getattr(self, sname, None):
- a[n] = getattr(self, sname)
- return a
+ for sname in attribute_names:
+ if names:
+ name = names.pop(0)
+ elif sname in kw:
+ name = kw[sname]
+ else:
+ name = sname
+ if name is not None and getattr(self, sname, False):
+ translated[name] = getattr(self, sname)
+ return translated
def make_url(name_or_url):
"""Given a string or unicode instance, produce a new URL instance.
@@ -134,36 +150,40 @@ def make_url(name_or_url):
def _parse_rfc1738_args(name):
pattern = re.compile(r'''
- (\w+)://
+ (?P<name>\w+)://
(?:
- ([^:/]*)
- (?::([^/]*))?
+ (?P<username>[^:/]*)
+ (?::(?P<password>[^/]*))?
@)?
(?:
- ([^/:]*)
- (?::([^/]*))?
+ (?P<host>[^/:]*)
+ (?::(?P<port>[^/]*))?
)?
- (?:/(.*))?
+ (?:/(?P<database>.*))?
'''
, re.X)
m = pattern.match(name)
if m is not None:
- (name, username, password, host, port, database) = m.group(1, 2, 3, 4, 5, 6)
- 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)
+ components = m.groupdict()
+ if components['database'] is not None:
+ tokens = components['database'].split('?', 2)
+ components['database'] = tokens[0]
+ query = (len(tokens) > 1 and dict(cgi.parse_qsl(tokens[1]))) or None
if query is not None:
query = dict([(k.encode('ascii'), query[k]) for k in query])
else:
query = None
- opts = {'username':username,'password':password,'host':host,'port':port,'database':database, 'query':query}
- if opts['password'] is not None:
- opts['password'] = urllib.unquote_plus(opts['password'])
- return URL(name, **opts)
+ components['query'] = query
+
+ if components['password'] is not None:
+ components['password'] = urllib.unquote_plus(components['password'])
+
+ name = components.pop('name')
+ return URL(name, **components)
else:
- raise exceptions.ArgumentError("Could not parse rfc1738 URL from string '%s'" % name)
+ raise exceptions.ArgumentError(
+ "Could not parse rfc1738 URL from string '%s'" % name)
def _parse_keyvalue_args(name):
m = re.match( r'(\w+)://(.*)', name)