]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Raised an error when sqlite version does not support default values. Addresses ...
authorMichael Trier <mtrier@gmail.com>
Tue, 29 Jul 2008 03:08:38 +0000 (03:08 +0000)
committerMichael Trier <mtrier@gmail.com>
Tue, 29 Jul 2008 03:08:38 +0000 (03:08 +0000)
lib/sqlalchemy/databases/sqlite.py
lib/sqlalchemy/engine/base.py
lib/sqlalchemy/engine/default.py
test/dialect/sqlite.py
test/orm/inheritance/basic.py

index b6e362ef2a02484da7a6fee75353162f03e1d9e6..b491ce07b43f04e5ae6b4f6099e75c0f9d6e2329 100644 (file)
@@ -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),
index 7cf09829445c0cfdb0ede6681265d6d5612f6638..18e816546d0002f18227c84eac3407526e5decff 100644 (file)
@@ -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):
index b68ce08185f975de2434ec945365ce9f7a4a5149..a3ae6d456585f8afd6a00e203e44f682e07ffa32 100644 (file)
@@ -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
index f1e476addc4fb26a19ce30d537495219866b6a6f..8c9d03d9750d8df2ed732b3e87bcd4652516e7d8 100644 (file)
@@ -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),
index 7545f233c34d96a52291225d456112d99e6e2de0..1f0cecbe41022d34b8147833f62dd3df9b2d4004 100644 (file)
@@ -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."""