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
db = Database(sqlite3.connect(":memory:"))
db = Database(sqlite3.connect(memory=True))
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.
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
==============

View file

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

View file

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

View file

@ -727,3 +727,10 @@ def test_create_table_numpy(fresh_db):
"np.uint8": 8,
}
] == 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)