diff options
author | Michael Trier <mtrier@gmail.com> | 2008-07-29 03:08:38 +0000 |
---|---|---|
committer | Michael Trier <mtrier@gmail.com> | 2008-07-29 03:08:38 +0000 |
commit | c622a86286573f2029e93923c2d5a98379fb794b (patch) | |
tree | 27888336ac6e21db37b63774b6720ed5de05e8d6 | |
parent | e411a837832f11707785962b06bf6ce0f3ac7e26 (diff) | |
download | sqlalchemy-c622a86286573f2029e93923c2d5a98379fb794b.tar.gz |
Raised an error when sqlite version does not support default values. Addresses #909 in a purposeful way.
-rw-r--r-- | lib/sqlalchemy/databases/sqlite.py | 10 | ||||
-rw-r--r-- | lib/sqlalchemy/engine/base.py | 2 | ||||
-rw-r--r-- | lib/sqlalchemy/engine/default.py | 1 | ||||
-rw-r--r-- | test/dialect/sqlite.py | 16 | ||||
-rw-r--r-- | test/orm/inheritance/basic.py | 2 |
5 files changed, 19 insertions, 12 deletions
diff --git a/lib/sqlalchemy/databases/sqlite.py b/lib/sqlalchemy/databases/sqlite.py index b6e362ef2..b491ce07b 100644 --- a/lib/sqlalchemy/databases/sqlite.py +++ b/lib/sqlalchemy/databases/sqlite.py @@ -222,6 +222,8 @@ class SQLiteDialect(default.DefaultDialect): "and will cause errors in some cases. Version 2.1.3 " "or greater is recommended.") % '.'.join([str(subver) for subver in sqlite_ver])) + if self.dbapi.sqlite_version_info < (3, 3, 8): + self.supports_default_values = False self.supports_cast = (self.dbapi is None or vers(self.dbapi.sqlite_version) >= vers("3.2.3")) def dbapi(cls): @@ -439,8 +441,12 @@ class SQLiteCompiler(compiler.DefaultCompiler): preparer = self.preparer if not colparams: - return "INSERT INTO %s DEFAULT VALUES" % ( - (preparer.format_table(insert_stmt.table),)) + if not self.dialect.supports_default_values: + raise exc.NotSupportedError( + "The version of SQLite you are using, %s, does not support DEFAULT VALUES." % (self.dialect.dbapi.sqlite_version)) + + return ("INSERT INTO %s DEFAULT VALUES" % ( + (preparer.format_table(insert_stmt.table),))) else: return ("INSERT INTO %s (%s) VALUES (%s)" % (preparer.format_table(insert_stmt.table), diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py index 7cf098294..18e816546 100644 --- a/lib/sqlalchemy/engine/base.py +++ b/lib/sqlalchemy/engine/base.py @@ -101,6 +101,8 @@ class Dialect(object): result sets against textual statements where no explicit typemap was present. + supports_default_values + Indicates if the construct ``INSERT INTO tablename DEFAULT VALUES`` is supported """ def create_connect_args(self, url): diff --git a/lib/sqlalchemy/engine/default.py b/lib/sqlalchemy/engine/default.py index b68ce0818..a3ae6d456 100644 --- a/lib/sqlalchemy/engine/default.py +++ b/lib/sqlalchemy/engine/default.py @@ -39,6 +39,7 @@ class DefaultDialect(base.Dialect): supports_pk_autoincrement = True dbapi_type_map = {} default_paramstyle = 'named' + supports_default_values = True def __init__(self, convert_unicode=False, assert_unicode=False, encoding='utf-8', paramstyle=None, dbapi=None, **kwargs): self.convert_unicode = convert_unicode diff --git a/test/dialect/sqlite.py b/test/dialect/sqlite.py index f1e476add..8c9d03d97 100644 --- a/test/dialect/sqlite.py +++ b/test/dialect/sqlite.py @@ -219,9 +219,7 @@ class InsertTest(TestBase, AssertsExecutionResults): __only_on__ = 'sqlite' # empty insert (i.e. INSERT INTO table DEFAULT VALUES) - # fails as recently as sqlite 3.3.6. passes on 3.4.1. this syntax - # is nowhere to be found in the sqlite3 documentation or changelog, so can't - # determine what versions in between it's legal for. + # fails on 3.3.7 and before def _test_empty_insert(self, table, expect=1): try: table.create() @@ -235,13 +233,13 @@ class InsertTest(TestBase, AssertsExecutionResults): finally: table.drop() - @testing.exclude('sqlite', '<', (3, 4), 'no database support') + @testing.exclude('sqlite', '<', (3, 3, 8), 'no database support') def test_empty_insert_pk1(self): self._test_empty_insert( Table('a', MetaData(testing.db), Column('id', Integer, primary_key=True))) - @testing.exclude('sqlite', '<', (3, 4), 'no database support') + @testing.exclude('sqlite', '<', (3, 3, 8), 'no database support') def test_empty_insert_pk2(self): self.assertRaises( exc.DBAPIError, @@ -250,7 +248,7 @@ class InsertTest(TestBase, AssertsExecutionResults): Column('x', Integer, primary_key=True), Column('y', Integer, primary_key=True))) - @testing.exclude('sqlite', '<', (3, 4), 'no database support') + @testing.exclude('sqlite', '<', (3, 3, 8), 'no database support') def test_empty_insert_pk3(self): self.assertRaises( exc.DBAPIError, @@ -260,20 +258,20 @@ class InsertTest(TestBase, AssertsExecutionResults): Column('y', Integer, DefaultClause('123'), primary_key=True))) - @testing.exclude('sqlite', '<', (3, 4), 'no database support') + @testing.exclude('sqlite', '<', (3, 3, 8), 'no database support') def test_empty_insert_pk4(self): self._test_empty_insert( Table('d', MetaData(testing.db), Column('x', Integer, primary_key=True), Column('y', Integer, DefaultClause('123')))) - @testing.exclude('sqlite', '<', (3, 4), 'no database support') + @testing.exclude('sqlite', '<', (3, 3, 8), 'no database support') def test_empty_insert_nopk1(self): self._test_empty_insert( Table('e', MetaData(testing.db), Column('id', Integer))) - @testing.exclude('sqlite', '<', (3, 4), 'no database support') + @testing.exclude('sqlite', '<', (3, 3, 8), 'no database support') def test_empty_insert_nopk2(self): self._test_empty_insert( Table('f', MetaData(testing.db), diff --git a/test/orm/inheritance/basic.py b/test/orm/inheritance/basic.py index 7545f233c..1f0cecbe4 100644 --- a/test/orm/inheritance/basic.py +++ b/test/orm/inheritance/basic.py @@ -830,7 +830,7 @@ class OverrideColKeyTest(ORMTest): sess.add(s1) sess.flush() assert sess.query(Sub).get(10) is s1 - + def test_plain_descriptor(self): """test that descriptors prevent inheritance from propigating properties to subclasses.""" |