Support Database(memory=True) for in-memory databases

This commit is contained in:
Simon Willison 2019-07-22 17:12:54 -07:00
commit 034d498b31
4 changed files with 25 additions and 6 deletions

View file

@ -27,7 +27,7 @@ If you want to create an in-memory database, you can do so like this:
.. code-block:: python .. code-block:: python
db = Database(sqlite3.connect(":memory:")) db = Database(sqlite3.connect(memory=True))
Tables are accessed using the indexing operator, like so: Tables are accessed using the indexing operator, like so:
@ -37,6 +37,14 @@ Tables are accessed using the indexing operator, like so:
If the table does not yet exist, it will be created the first time you attempt to insert or upsert data into it. If the table does not yet exist, it will be created the first time you attempt to insert or upsert data into it.
You can also access tables using the ``.table()`` method like so:
.. code-block:: python
table = db.table("my_table")
Using this factory function allows you to set :ref:`python_api_table_configuration`.
Listing tables Listing tables
============== ==============

View file

@ -85,8 +85,13 @@ class NotFoundError(Exception):
class Database: class Database:
def __init__(self, filename_or_conn): def __init__(self, filename_or_conn=None, memory=False):
if isinstance(filename_or_conn, str): 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"
if memory:
self.conn = sqlite3.connect(":memory:")
elif isinstance(filename_or_conn, str):
self.conn = sqlite3.connect(filename_or_conn) self.conn = sqlite3.connect(filename_or_conn)
elif isinstance(filename_or_conn, pathlib.Path): elif isinstance(filename_or_conn, pathlib.Path):
self.conn = sqlite3.connect(str(filename_or_conn)) self.conn = sqlite3.connect(str(filename_or_conn))

View file

@ -1,16 +1,15 @@
from sqlite_utils import Database from sqlite_utils import Database
from sqlite_utils.utils import sqlite3
import pytest import pytest
@pytest.fixture @pytest.fixture
def fresh_db(): def fresh_db():
return Database(sqlite3.connect(":memory:")) return Database(memory=True)
@pytest.fixture @pytest.fixture
def existing_db(): def existing_db():
database = Database(sqlite3.connect(":memory:")) database = Database(memory=True)
database.conn.executescript( database.conn.executescript(
""" """
CREATE TABLE foo (text TEXT); CREATE TABLE foo (text TEXT);

View file

@ -727,3 +727,10 @@ def test_create_table_numpy(fresh_db):
"np.uint8": 8, "np.uint8": 8,
} }
] == list(fresh_db["types"].rows) ] == list(fresh_db["types"].rows)
def test_cannot_provide_both_filename_and_memory():
with pytest.raises(
AssertionError, match="Either specify a filename_or_conn or pass memory=True"
):
db = Database("/tmp/foo.db", memory=True)