From acb3f8e20f2b1640d4fb58f4c2fdc5951591cf45 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sun, 2 Aug 2009 19:00:59 +0000 Subject: [PATCH] correct / test the autoincrement reflection policy --- lib/sqlalchemy/dialects/sqlite/base.py | 1 + lib/sqlalchemy/engine/default.py | 2 +- lib/sqlalchemy/engine/reflection.py | 3 ++- test/engine/test_reflection.py | 31 ++++++++++++++++++++++++++ 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/lib/sqlalchemy/dialects/sqlite/base.py b/lib/sqlalchemy/dialects/sqlite/base.py index b644c7bf80..8dea91d0ab 100644 --- a/lib/sqlalchemy/dialects/sqlite/base.py +++ b/lib/sqlalchemy/dialects/sqlite/base.py @@ -270,6 +270,7 @@ class SQLiteDialect(default.DefaultDialect): supports_default_values = True supports_empty_insert = False supports_cast = True + default_paramstyle = 'qmark' statement_compiler = SQLiteCompiler ddl_compiler = SQLiteDDLCompiler diff --git a/lib/sqlalchemy/engine/default.py b/lib/sqlalchemy/engine/default.py index 45918618d4..bede3b7018 100644 --- a/lib/sqlalchemy/engine/default.py +++ b/lib/sqlalchemy/engine/default.py @@ -386,7 +386,7 @@ class DefaultExecutionContext(base.ExecutionContext): if self.dialect.postfetch_lastrowid and \ (not len(self._last_inserted_ids) or \ None in self._last_inserted_ids): - + table = self.compiled.statement.table lastrowid = self.get_lastrowid() self._last_inserted_ids = [c is table._autoincrement_column and lastrowid or v diff --git a/lib/sqlalchemy/engine/reflection.py b/lib/sqlalchemy/engine/reflection.py index 5ac4756bee..173e0fab00 100644 --- a/lib/sqlalchemy/engine/reflection.py +++ b/lib/sqlalchemy/engine/reflection.py @@ -282,8 +282,9 @@ class Inspector(object): coltype = col_d['type'] col_kw = { 'nullable':col_d['nullable'], - 'autoincrement':col_d.get('autoincrement', False) } + if 'autoincrement' in col_d: + col_kw['autoincrement'] = col_d['autoincrement'] colargs = [] if col_d.get('default') is not None: diff --git a/test/engine/test_reflection.py b/test/engine/test_reflection.py index bcf0de67e4..dff9fa1bb6 100644 --- a/test/engine/test_reflection.py +++ b/test/engine/test_reflection.py @@ -138,6 +138,37 @@ class ReflectionTest(TestBase, ComparesTables): finally: m.drop_all() + def test_autoincrement_col(self): + """test that 'autoincrement' is reflected according to sqla's policy. + + Don't mark this test as unsupported for any backend ! + + (technically it fails with MySQL InnoDB since "id" comes before "id2") + + """ + + meta = MetaData(testing.db) + t1 = Table('test', meta, + Column('id', sa.Integer, primary_key=True), + Column('data', sa.String(50)), + ) + t2 = Table('test2', meta, + Column('id', sa.Integer, sa.ForeignKey('test.id'), primary_key=True), + Column('id2', sa.Integer, primary_key=True), + Column('data', sa.String(50)), + ) + meta.create_all() + try: + m2 = MetaData(testing.db) + t1a = Table('test', m2, autoload=True) + assert t1a._autoincrement_column is t1a.c.id + + t2a = Table('test2', m2, autoload=True) + assert t2a._autoincrement_column is t2a.c.id2 + + finally: + meta.drop_all() + def test_unknown_types(self): meta = MetaData(testing.db) t = Table("test", meta, -- 2.47.3