- 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
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
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
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:
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
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'