diff options
Diffstat (limited to 'lib/sqlalchemy')
| -rw-r--r-- | lib/sqlalchemy/dialects/sqlite/base.py | 13 | ||||
| -rw-r--r-- | lib/sqlalchemy/testing/requirements.py | 5 | ||||
| -rw-r--r-- | lib/sqlalchemy/testing/suite/test_reflection.py | 30 |
3 files changed, 45 insertions, 3 deletions
diff --git a/lib/sqlalchemy/dialects/sqlite/base.py b/lib/sqlalchemy/dialects/sqlite/base.py index 1eea2b6c6..424f91fa6 100644 --- a/lib/sqlalchemy/dialects/sqlite/base.py +++ b/lib/sqlalchemy/dialects/sqlite/base.py @@ -1941,17 +1941,24 @@ class SQLiteDialect(default.DefaultDialect): "sqlite_autoindex" ): continue - indexes.append(dict(name=row[1], column_names=[], unique=row[2])) # loop thru unique indexes to get the column names. - for idx in indexes: + for idx in list(indexes): pragma_index = self._get_table_pragma( connection, "index_info", idx["name"] ) for row in pragma_index: - idx["column_names"].append(row[2]) + if row[2] is None: + util.warn( + "Skipped unsupported reflection of " + "expression-based index %s" % idx["name"] + ) + indexes.remove(idx) + break + else: + idx["column_names"].append(row[2]) return indexes @reflection.cache diff --git a/lib/sqlalchemy/testing/requirements.py b/lib/sqlalchemy/testing/requirements.py index 941a9458b..ce9954cfd 100644 --- a/lib/sqlalchemy/testing/requirements.py +++ b/lib/sqlalchemy/testing/requirements.py @@ -454,6 +454,11 @@ class SuiteRequirements(Requirements): return exclusions.open() @property + def indexes_with_expressions(self): + """target database supports CREATE INDEX against SQL expressions.""" + return exclusions.closed() + + @property def unique_constraint_reflection(self): """target dialect supports reflection of unique constraints""" return exclusions.open() diff --git a/lib/sqlalchemy/testing/suite/test_reflection.py b/lib/sqlalchemy/testing/suite/test_reflection.py index 96bd188ee..d589c046f 100644 --- a/lib/sqlalchemy/testing/suite/test_reflection.py +++ b/lib/sqlalchemy/testing/suite/test_reflection.py @@ -6,6 +6,7 @@ from .. import assert_raises_message from .. import config from .. import engines from .. import eq_ +from .. import expect_warnings from .. import fixtures from .. import is_ from ..schema import Column @@ -792,6 +793,35 @@ class ComponentReflectionTest(fixtures.TablesTest): def test_get_noncol_index_pk(self): self._test_get_noncol_index("noncol_idx_test_pk", "noncol_idx_pk") + @testing.requires.indexes_with_expressions + @testing.provide_metadata + def test_reflect_expression_based_indexes(self): + Table( + "t", + self.metadata, + Column("x", String(30)), + Column("y", String(30)), + ) + event.listen( + self.metadata, + "after_create", + DDL("CREATE INDEX t_idx ON t(lower(x), lower(y))"), + ) + event.listen( + self.metadata, "after_create", DDL("CREATE INDEX t_idx_2 ON t(x)") + ) + self.metadata.create_all() + + insp = inspect(self.metadata.bind) + + with expect_warnings( + "Skipped unsupported reflection of expression-based index t_idx" + ): + eq_( + insp.get_indexes("t"), + [{"name": "t_idx_2", "column_names": ["x"], "unique": 0}], + ) + @testing.requires.unique_constraint_reflection def test_get_unique_constraints(self): self._test_get_unique_constraints() |
