]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
sqlite reflection now stores the actual DefaultClause value for the column.
authorMichael Trier <mtrier@gmail.com>
Fri, 2 Jan 2009 22:40:45 +0000 (22:40 +0000)
committerMichael Trier <mtrier@gmail.com>
Fri, 2 Jan 2009 22:40:45 +0000 (22:40 +0000)
CHANGES
lib/sqlalchemy/databases/sqlite.py
test/dialect/sqlite.py

diff --git a/CHANGES b/CHANGES
index 4b3c3a21d72dc6ec67991e9064c889c262194bf7..84759a9fd18301ef0d8a2138dafcf0a764ae5216 100644 (file)
--- 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
index 270e067f45c11b26fea0fa22f6d906112b69f7ad..1d89d1147caf92b869c492bc7cf18052fe891951 100644 (file)
@@ -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
index bc6891ac63acfa99e0fe37c08562bb935ad41b88..e217895e067adbf853c57f84aa5e4fd5ff7ab87b 100644 (file)
@@ -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'