Skip to content

Commit

Permalink
.table_names and .tables properties plus expanded docs
Browse files Browse the repository at this point in the history
  • Loading branch information
Simon Willison committed Aug 1, 2018
1 parent f4907f6 commit 515d362
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 11 deletions.
26 changes: 22 additions & 4 deletions docs/table.rst
Original file line number Diff line number Diff line change
@@ -1,19 +1,37 @@
=======
Table
=======
======================
Databases and Tables
======================

Tables are accessed using the indexing operator, like so:
Database objects are constructed by passing in a SQLite3 database connection:

.. code-block:: python
from sqlite_utils import Database
import sqlite3
db = Database(sqlite3.connect("my_database.db"))
Tables are accessed using the indexing operator, like so:

.. code-block:: python
table = db["my_table"]
If the table does not yet exist, it will be created the first time you attempt to insert or upsert data into it.

Listing tables
==============

You can list the names of tables in a database using the ``.table_names`` property::

>>> db.table_names
['dogs']

You can also iterate through the table objects themselves using ``.tables``::

>>> db.tables
[<Table dogs>]

Creating tables
===============

Expand Down
16 changes: 14 additions & 2 deletions sqlite_utils/db.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,22 @@ def __init__(self, filename_or_conn):
def __getitem__(self, table_name):
return Table(self, table_name)

def __repr__(self):
return "<Database {}>".format(self.conn)

@property
def tables(self):
def table_names(self):
return [
r[0]
for r in self.conn.execute(
"select name from sqlite_master where type = 'table'"
).fetchall()
]

@property
def tables(self):
return [self[name] for name in self.table_names]

def create_table(self, name, columns, pk=None, foreign_keys=None):
foreign_keys = foreign_keys or []
foreign_keys_by_name = {fk[0]: fk for fk in foreign_keys}
Expand Down Expand Up @@ -69,7 +76,12 @@ class Table:
def __init__(self, db, name):
self.db = db
self.name = name
self.exists = self.name in self.db.tables
self.exists = self.name in self.db.table_names

def __repr__(self):
return "<Table {}{}>".format(
self.name, " (does not exist yet)" if not self.exists else ""
)

@property
def count(self):
Expand Down
6 changes: 3 additions & 3 deletions tests/test_create.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@


def test_create_table(fresh_db):
assert [] == fresh_db.tables
assert [] == fresh_db.table_names
table = fresh_db.create_table(
"test_table",
{"text_col": str, "float_col": float, "int_col": int, "bool_col": bool},
)
assert ["test_table"] == fresh_db.tables
assert ["test_table"] == fresh_db.table_names
assert [
{"name": "text_col", "type": "TEXT"},
{"name": "float_col", "type": "FLOAT"},
Expand All @@ -29,7 +29,7 @@ def test_create_table(fresh_db):
)
def test_create_table_from_example(fresh_db, example, expected_columns):
fresh_db["people"].insert(example)
assert ["people"] == fresh_db.tables
assert ["people"] == fresh_db.table_names
assert expected_columns == [
{"name": col.name, "type": col.type} for col in fresh_db["people"].columns
]
Expand Down
4 changes: 2 additions & 2 deletions tests/test_enable_fts.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
def test_enable_fts(fresh_db):
table = fresh_db["searchable"]
table.insert_all(search_records)
assert ["searchable"] == fresh_db.tables
assert ["searchable"] == fresh_db.table_names
table.enable_fts(["text", "country"])
assert [
"searchable",
Expand All @@ -19,7 +19,7 @@ def test_enable_fts(fresh_db):
"searchable_fts_segdir",
"searchable_fts_docsize",
"searchable_fts_stat",
] == fresh_db.tables
] == fresh_db.table_names
assert [("tanuki are tricksters", "Japan", "foo")] == table.search("tanuki")
assert [("racoons are trash pandas", "USA", "bar")] == table.search("usa")
assert [] == table.search("bar")
Expand Down
13 changes: 13 additions & 0 deletions tests/test_introspect.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,15 @@
from .fixtures import existing_db


def test_table_names(existing_db):
assert ["foo"] == existing_db.table_names


def test_tables(existing_db):
assert 1 == len(existing_db.tables)
assert "foo" == existing_db.tables[0].name


def test_count(existing_db):
assert 3 == existing_db["foo"].count

Expand All @@ -14,3 +23,7 @@ def test_columns(existing_db):

def test_schema(existing_db):
assert "CREATE TABLE foo (text TEXT)" == existing_db["foo"].schema


def test_table_repr(existing_db):
assert "<Table foo>" == repr(existing_db["foo"])

0 comments on commit 515d362

Please sign in to comment.