summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2009-10-01 23:00:02 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2009-10-01 23:00:02 +0000
commit8e8da289d5fb0f1f74d588ebf3da155203d5bef1 (patch)
treecb57c7bdb9850d570e03f12d7e69a3739ab2acf7
parentddbcf97f3343f9ccad1a04b258086b7f55577c43 (diff)
downloadsqlalchemy-8e8da289d5fb0f1f74d588ebf3da155203d5bef1.tar.gz
- boolean, int, and float arguments count as "cache key" values for inspector info_cache()
- added awareness of sqlite implicit auto indexes [ticket:1551]
-rw-r--r--lib/sqlalchemy/dialects/sqlite/base.py6
-rw-r--r--lib/sqlalchemy/engine/reflection.py13
-rw-r--r--test/dialect/test_sqlite.py20
3 files changed, 35 insertions, 4 deletions
diff --git a/lib/sqlalchemy/dialects/sqlite/base.py b/lib/sqlalchemy/dialects/sqlite/base.py
index 8dea91d0a..c25e75f2c 100644
--- a/lib/sqlalchemy/dialects/sqlite/base.py
+++ b/lib/sqlalchemy/dialects/sqlite/base.py
@@ -498,6 +498,7 @@ class SQLiteDialect(default.DefaultDialect):
pragma = "PRAGMA %s." % quote(schema)
else:
pragma = "PRAGMA "
+ include_auto_indexes = kw.pop('include_auto_indexes', False)
qtable = quote(table_name)
c = _pragma_cursor(connection.execute("%sindex_list(%s)" % (pragma, qtable)))
indexes = []
@@ -505,6 +506,11 @@ class SQLiteDialect(default.DefaultDialect):
row = c.fetchone()
if row is None:
break
+ # ignore implicit primary key index.
+ # http://www.mail-archive.com/sqlite-users@sqlite.org/msg30517.html
+ elif not include_auto_indexes and row[1].startswith('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:
diff --git a/lib/sqlalchemy/engine/reflection.py b/lib/sqlalchemy/engine/reflection.py
index 173e0fab0..d88a0a3d2 100644
--- a/lib/sqlalchemy/engine/reflection.py
+++ b/lib/sqlalchemy/engine/reflection.py
@@ -33,7 +33,7 @@ def cache(fn, self, con, *args, **kw):
key = (
fn.__name__,
tuple(a for a in args if isinstance(a, basestring)),
- tuple((k, v) for k, v in kw.iteritems() if isinstance(v, basestring))
+ tuple((k, v) for k, v in kw.iteritems() if isinstance(v, (basestring, int, float)))
)
ret = info_cache.get(key)
if ret is None:
@@ -207,6 +207,10 @@ class Inspector(object):
referred_columns
a list of column names in the referred table that correspond to
constrained_columns
+
+ \**kw
+ other options passed to the dialect's get_foreign_keys() method.
+
"""
fk_defs = self.dialect.get_foreign_keys(self.conn, table_name, schema,
@@ -214,7 +218,7 @@ class Inspector(object):
**kw)
return fk_defs
- def get_indexes(self, table_name, schema=None):
+ def get_indexes(self, table_name, schema=None, **kw):
"""Return information about indexes in `table_name`.
Given a string `table_name` and an optional string `schema`, return
@@ -228,11 +232,14 @@ class Inspector(object):
unique
boolean
+
+ \**kw
+ other options passed to the dialect's get_indexes() method.
"""
indexes = self.dialect.get_indexes(self.conn, table_name,
schema,
- info_cache=self.info_cache)
+ info_cache=self.info_cache, **kw)
return indexes
def reflecttable(self, table, include_columns):
diff --git a/test/dialect/test_sqlite.py b/test/dialect/test_sqlite.py
index 95d14e9a0..040397f4c 100644
--- a/test/dialect/test_sqlite.py
+++ b/test/dialect/test_sqlite.py
@@ -289,7 +289,25 @@ class DialectTest(TestBase, AssertsExecutionResults):
except exc.DBAPIError:
pass
raise
-
+
+
+ def test_dont_reflect_autoindex(self):
+ meta = MetaData(testing.db)
+ t = Table('foo', meta, Column('bar', String, primary_key=True))
+ meta.create_all()
+
+ from sqlalchemy.engine.reflection import Inspector
+ try:
+ inspector = Inspector(testing.db)
+ eq_(inspector.get_indexes('foo'), [])
+ eq_(
+ inspector.get_indexes('foo', include_auto_indexes=True),
+ [{'unique': 1, 'name': u'sqlite_autoindex_foo_1', 'column_names': [u'bar']}]
+ )
+ finally:
+ meta.drop_all()
+
+
def test_set_isolation_level(self):
"""Test setting the read uncommitted/serializable levels"""
eng = create_engine(testing.db.url)