From: Mike Bayer Date: Thu, 1 Oct 2009 23:00:02 +0000 (+0000) Subject: - boolean, int, and float arguments count as "cache key" values for inspector info_ca... X-Git-Tag: rel_0_6beta1~270 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8e8da289d5fb0f1f74d588ebf3da155203d5bef1;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - boolean, int, and float arguments count as "cache key" values for inspector info_cache() - added awareness of sqlite implicit auto indexes [ticket:1551] --- diff --git a/lib/sqlalchemy/dialects/sqlite/base.py b/lib/sqlalchemy/dialects/sqlite/base.py index 8dea91d0ab..c25e75f2c9 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 173e0fab00..d88a0a3d29 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 95d14e9a05..040397f4c3 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)