summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/build/changelog/unreleased_14/6586.rst10
-rw-r--r--lib/sqlalchemy/dialects/sqlite/pysqlcipher.py2
-rw-r--r--lib/sqlalchemy/engine/create.py3
-rw-r--r--test/dialect/test_sqlite.py9
-rw-r--r--test/engine/test_parseconnect.py33
5 files changed, 54 insertions, 3 deletions
diff --git a/doc/build/changelog/unreleased_14/6586.rst b/doc/build/changelog/unreleased_14/6586.rst
new file mode 100644
index 000000000..027f1b01d
--- /dev/null
+++ b/doc/build/changelog/unreleased_14/6586.rst
@@ -0,0 +1,10 @@
+.. change::
+ :tags: bug, sqlite, regression
+ :tickets: 6586
+
+ The fix for pysqlcipher released in version 1.4.3 :ticket:`5848` was
+ unfortunately non-working, in that the new ``on_connect_url`` hook was
+ erroneously not receiving a ``URL`` object under normal usage of
+ :func:`_sa.create_engine` and instead received a string that was unhandled;
+ the test suite failed to fully set up the actual conditions under which
+ this hook is called. This has been fixed.
diff --git a/lib/sqlalchemy/dialects/sqlite/pysqlcipher.py b/lib/sqlalchemy/dialects/sqlite/pysqlcipher.py
index ff02d4dee..1a9337671 100644
--- a/lib/sqlalchemy/dialects/sqlite/pysqlcipher.py
+++ b/lib/sqlalchemy/dialects/sqlite/pysqlcipher.py
@@ -9,7 +9,7 @@
.. dialect:: sqlite+pysqlcipher
:name: pysqlcipher
:dbapi: sqlcipher 3 or pysqlcipher
- :connectstring: sqlite+pysqlcipher://:passphrase/file_path[?kdf_iter=<iter>]
+ :connectstring: sqlite+pysqlcipher://:passphrase@/file_path[?kdf_iter=<iter>]
Dialect for support of DBAPIs that make use of the
`SQLCipher <https://www.zetetic.net/sqlcipher>`_ backend.
diff --git a/lib/sqlalchemy/engine/create.py b/lib/sqlalchemy/engine/create.py
index 0351f2ebc..3cf339cfc 100644
--- a/lib/sqlalchemy/engine/create.py
+++ b/lib/sqlalchemy/engine/create.py
@@ -649,8 +649,7 @@ def create_engine(url, **kwargs):
engine = engineclass(pool, dialect, u, **engine_args)
if _initialize:
-
- do_on_connect = dialect.on_connect_url(url)
+ do_on_connect = dialect.on_connect_url(u)
if do_on_connect:
if _wrap_do_on_connect:
do_on_connect = _wrap_do_on_connect(do_on_connect)
diff --git a/test/dialect/test_sqlite.py b/test/dialect/test_sqlite.py
index 95dbecdc8..9285041df 100644
--- a/test/dialect/test_sqlite.py
+++ b/test/dialect/test_sqlite.py
@@ -596,6 +596,15 @@ class DialectTest(
)
)
+ @testing.only_on("sqlite+pysqlcipher")
+ def test_pysqlcipher_connects(self):
+ """test #6586"""
+ str_url = str(testing.db.url)
+ e = create_engine(str_url)
+
+ with e.connect() as conn:
+ eq_(conn.scalar(text("select 1")), 1)
+
@testing.provide_metadata
def test_extra_reserved_words(self, connection):
"""Tests reserved words in identifiers.
diff --git a/test/engine/test_parseconnect.py b/test/engine/test_parseconnect.py
index 5e8fbfb5f..ea949dfd6 100644
--- a/test/engine/test_parseconnect.py
+++ b/test/engine/test_parseconnect.py
@@ -485,6 +485,39 @@ class CreateEngineTest(fixtures.TestBase):
eq_(e.dialect.foobar, 5)
eq_(e.dialect.bathoho, False)
+ def test_on_connect_url(self):
+ """test #6586"""
+
+ tokens = __name__.split(".")
+
+ canary = mock.Mock()
+
+ class MyDialect(MockDialect):
+ def on_connect_url(self, url):
+ canary.on_connect_url(url)
+
+ global dialect
+ dialect = MyDialect
+ registry.register(
+ "mockdialect.ocu", ".".join(tokens[0:-1]), tokens[-1]
+ )
+
+ create_engine("mockdialect+ocu://foo:bar@host/test")
+ eq_(
+ canary.mock_calls,
+ [
+ mock.call.on_connect_url(
+ url.URL.create(
+ drivername="mockdialect+ocu",
+ username="foo",
+ password="bar",
+ host="host",
+ database="test",
+ )
+ )
+ ],
+ )
+
def test_custom(self):
dbapi = MockDBAPI(
foober=12, lala=18, hoho={"this": "dict"}, fooz="somevalue"