diff options
| -rw-r--r-- | doc/build/changelog/unreleased_13/5341.rst | 7 | ||||
| -rw-r--r-- | lib/sqlalchemy/engine/url.py | 2 | ||||
| -rw-r--r-- | test/engine/test_parseconnect.py | 5 |
3 files changed, 13 insertions, 1 deletions
diff --git a/doc/build/changelog/unreleased_13/5341.rst b/doc/build/changelog/unreleased_13/5341.rst new file mode 100644 index 000000000..28df9cb58 --- /dev/null +++ b/doc/build/changelog/unreleased_13/5341.rst @@ -0,0 +1,7 @@ +.. change:: + :tags: bug, engine + :tickets: 5341 + + Fixed issue in :class:`.URL` object where stringifying the object + would not URL encode special characters, preventing the URL from being + re-consumable as a real URL. Pull request courtesy Miguel Grinberg.
\ No newline at end of file diff --git a/lib/sqlalchemy/engine/url.py b/lib/sqlalchemy/engine/url.py index 5950fa021..7b7a0047c 100644 --- a/lib/sqlalchemy/engine/url.py +++ b/lib/sqlalchemy/engine/url.py @@ -96,7 +96,7 @@ class URL(object): keys = list(self.query) keys.sort() s += "?" + "&".join( - "%s=%s" % (k, element) + "%s=%s" % (util.quote_plus(k), util.quote_plus(element)) for k in keys for element in util.to_list(self.query[k]) ) diff --git a/test/engine/test_parseconnect.py b/test/engine/test_parseconnect.py index 1277425c1..77b882f2c 100644 --- a/test/engine/test_parseconnect.py +++ b/test/engine/test_parseconnect.py @@ -147,6 +147,11 @@ class URLTest(fixtures.TestBase): "dialect://user:pass@host/db?arg1=param1&arg2=param2&arg2=param3", ) + test_url = "dialect://user:pass@host/db?arg1%3D=param1&arg2=param+2" + u = url.make_url(test_url) + eq_(u.query, {"arg1=": "param1", "arg2": "param 2"}) + eq_(str(u), test_url) + def test_comparison(self): components = ( "drivername", |
