From 6ea3521b45c17b9575232b5a76e9ef76699bcd01 Mon Sep 17 00:00:00 2001 From: Michael Trier Date: Fri, 2 Jan 2009 22:40:45 +0000 Subject: [PATCH] sqlite reflection now stores the actual DefaultClause value for the column. --- CHANGES | 4 +++ lib/sqlalchemy/databases/sqlite.py | 8 ++--- test/dialect/sqlite.py | 48 ++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index 4b3c3a21d7..84759a9fd1 100644 --- a/CHANGES +++ b/CHANGES @@ -60,6 +60,10 @@ CHANGES - Added in the MSReal and MSNText types. +- sqlite + - Table reflection now stores the actual DefaultClause value + for the column. [ticket:1266] + - bugfixes, behavioral changes - general - orm diff --git a/lib/sqlalchemy/databases/sqlite.py b/lib/sqlalchemy/databases/sqlite.py index 270e067f45..1d89d1147c 100644 --- a/lib/sqlalchemy/databases/sqlite.py +++ b/lib/sqlalchemy/databases/sqlite.py @@ -122,7 +122,7 @@ always represented by an actual database result string. import datetime, re, time -from sqlalchemy import schema, exc, pool, DefaultClause +from sqlalchemy import sql, schema, exc, pool, DefaultClause from sqlalchemy.engine import default import sqlalchemy.types as sqltypes import sqlalchemy.util as util @@ -465,7 +465,7 @@ class SQLiteDialect(default.DefaultDialect): break found_table = True - (name, type_, nullable, has_default, primary_key) = (row[1], row[2].upper(), not row[3], row[4] is not None, row[5]) + (name, type_, nullable, default, has_default, primary_key) = (row[1], row[2].upper(), not row[3], row[4], row[4] is not None, row[5]) name = re.sub(r'^\"|\"$', '', name) if include_columns and name not in include_columns: continue @@ -490,7 +490,7 @@ class SQLiteDialect(default.DefaultDialect): colargs = [] if has_default: - colargs.append(DefaultClause('?')) + colargs.append(DefaultClause(sql.text(default))) table.append_column(schema.Column(name, coltype, primary_key = primary_key, nullable = nullable, *colargs)) if not found_table: @@ -616,4 +616,4 @@ dialect.poolclass = pool.SingletonThreadPool dialect.statement_compiler = SQLiteCompiler dialect.schemagenerator = SQLiteSchemaGenerator dialect.preparer = SQLiteIdentifierPreparer -dialect.execution_ctx_cls = SQLiteExecutionContext \ No newline at end of file +dialect.execution_ctx_cls = SQLiteExecutionContext diff --git a/test/dialect/sqlite.py b/test/dialect/sqlite.py index bc6891ac63..e217895e06 100644 --- a/test/dialect/sqlite.py +++ b/test/dialect/sqlite.py @@ -116,6 +116,54 @@ class TestTypes(TestBase, AssertsExecutionResults): finally: m.drop_all() + +class TestDefaults(TestBase, AssertsExecutionResults): + __only_on__ = 'sqlite' + + def test_default_reflection(self): + # (ask_for, roundtripped_as_if_different) + specs = [( String(3), '"foo"' ), + ( NUMERIC(10,2), '100.50' ), + ( Integer, '5' ), + ( Boolean, 'False' ), + ] + columns = [Column('c%i' % (i + 1), t[0], server_default=text(t[1])) for i, t in enumerate(specs)] + + db = testing.db + m = MetaData(db) + t_table = Table('defaults', m, *columns) + + try: + m.create_all() + + m2 = MetaData(db) + rt = Table('defaults', m2, autoload=True) + expected = [c[1] for c in specs] + for i, reflected in enumerate(rt.c): + self.assertEquals(reflected.server_default.arg.text, expected[i]) + finally: + m.drop_all() + + def test_default_reflection_2(self): + db = testing.db + m = MetaData(db) + + expected = ["'my_default'", '0'] + table = """CREATE TABLE defaults ( + data VARCHAR(40) DEFAULT 'my_default', + val INTEGER NOT NULL DEFAULT 0 + )""" + + try: + db.execute(table) + + rt = Table('defaults', m, autoload=True) + for i, reflected in enumerate(rt.c): + self.assertEquals(reflected.server_default.arg.text, expected[i]) + finally: + db.execute("DROP TABLE defaults") + + class DialectTest(TestBase, AssertsExecutionResults): __only_on__ = 'sqlite' -- 2.47.3