From de1059034486166131f2b2cd59ad69b4d26d6e25 Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Mon, 7 Sep 2020 13:45:06 -0700 Subject: [PATCH] recursive_triggers=on by default, closes #152 Refs #149 --- docs/python-api.rst | 6 ++++++ sqlite_utils/db.py | 10 +++++++++- tests/test_constructor.py | 12 ++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 tests/test_constructor.py diff --git a/docs/python-api.rst b/docs/python-api.rst index 23de88f..ad83b99 100644 --- a/docs/python-api.rst +++ b/docs/python-api.rst @@ -37,6 +37,12 @@ If you want to create an in-memory database, you can do so like this: db = Database(memory=True) +Connections use ``PRAGMA recursive_triggers=on`` by default. If you don't want to use `recursive triggers `__ you can turn them off using: + +.. code-block:: python + + db = Database(memory=True, recursive_triggers=False) + Tables are accessed using the indexing operator, like so: .. code-block:: python diff --git a/sqlite_utils/db.py b/sqlite_utils/db.py index 6bd779a..de67bce 100644 --- a/sqlite_utils/db.py +++ b/sqlite_utils/db.py @@ -103,7 +103,13 @@ class PrimaryKeyRequired(Exception): class Database: - def __init__(self, filename_or_conn=None, memory=False, recreate=False): + def __init__( + self, + filename_or_conn=None, + memory=False, + recreate=False, + recursive_triggers=True, + ): assert (filename_or_conn is not None and not memory) or ( filename_or_conn is None and memory ), "Either specify a filename_or_conn or pass memory=True" @@ -116,6 +122,8 @@ class Database: else: assert not recreate, "recreate cannot be used with connections, only paths" self.conn = filename_or_conn + if recursive_triggers: + self.conn.execute("PRAGMA recursive_triggers=on;") def __getitem__(self, table_name): return self.table(table_name) diff --git a/tests/test_constructor.py b/tests/test_constructor.py new file mode 100644 index 0000000..8a790c2 --- /dev/null +++ b/tests/test_constructor.py @@ -0,0 +1,12 @@ +from sqlite_utils import Database +import pytest + + +def test_recursive_triggers(): + db = Database(memory=True) + assert db.conn.execute("PRAGMA recursive_triggers").fetchone()[0] + + +def test_recursive_triggers_off(): + db = Database(memory=True, recursive_triggers=False) + assert not db.conn.execute("PRAGMA recursive_triggers").fetchone()[0]