Make square braces only return tables, not views

Breaking change for 4.0: db["name"] now only returns Table objects, never View objects.
This improves type safety since views lack methods like .insert().

Use db.view("view_name") to access views explicitly.

Closes #699
This commit is contained in:
Claude 2025-12-21 00:32:25 +00:00
commit c791a31047
No known key found for this signature in database
6 changed files with 18 additions and 15 deletions

View file

@ -1367,7 +1367,8 @@ def test_create_view():
)
assert result.exit_code == 0
assert (
'CREATE VIEW "version" AS select sqlite_version()' == db["version"].schema
'CREATE VIEW "version" AS select sqlite_version()'
== db.view("version").schema
)
@ -1404,7 +1405,7 @@ def test_create_view_ignore():
assert result.exit_code == 0
assert (
'CREATE VIEW "version" AS select sqlite_version() + 1'
== db["version"].schema
== db.view("version").schema
)
@ -1425,7 +1426,8 @@ def test_create_view_replace():
)
assert result.exit_code == 0
assert (
'CREATE VIEW "version" AS select sqlite_version()' == db["version"].schema
'CREATE VIEW "version" AS select sqlite_version()'
== db.view("version").schema
)

View file

@ -1082,7 +1082,7 @@ def test_drop(fresh_db):
def test_drop_view(fresh_db):
fresh_db.create_view("foo_view", "select 1")
assert ["foo_view"] == fresh_db.view_names()
assert None is fresh_db["foo_view"].drop()
assert None is fresh_db.view("foo_view").drop()
assert [] == fresh_db.view_names()
@ -1093,7 +1093,7 @@ def test_drop_ignore(fresh_db):
# Testing view is harder, we need to create it in order
# to get a View object, then drop it twice
fresh_db.create_view("foo_view", "select 1")
view = fresh_db["foo_view"]
view = fresh_db.view("foo_view")
assert isinstance(view, View)
view.drop()
with pytest.raises(sqlite3.OperationalError):

View file

@ -424,7 +424,7 @@ def test_enable_fts_error_message_on_views():
db = Database(memory=True)
db.create_view("hello", "select 1 + 1")
with pytest.raises(NotImplementedError) as e:
db["hello"].enable_fts() # type: ignore[call-arg]
db.view("hello").enable_fts() # type: ignore[call-arg]
assert e.value.args[0] == "enable_fts() is supported on tables but not on views"

View file

@ -15,7 +15,6 @@ def test_tracer():
("select name from sqlite_master where type = 'view'", None),
("select name from sqlite_master where type = 'table'", None),
("select name from sqlite_master where type = 'view'", None),
("select name from sqlite_master where type = 'view'", None),
("select name from sqlite_master where type = 'table'", None),
("select name from sqlite_master where type = 'view'", None),
('CREATE TABLE "dogs" (\n "name" TEXT\n);\n ', None),