summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Trier <mtrier@gmail.com>2008-07-29 03:08:38 +0000
committerMichael Trier <mtrier@gmail.com>2008-07-29 03:08:38 +0000
commitc622a86286573f2029e93923c2d5a98379fb794b (patch)
tree27888336ac6e21db37b63774b6720ed5de05e8d6
parente411a837832f11707785962b06bf6ce0f3ac7e26 (diff)
downloadsqlalchemy-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.py10
-rw-r--r--lib/sqlalchemy/engine/base.py2
-rw-r--r--lib/sqlalchemy/engine/default.py1
-rw-r--r--test/dialect/sqlite.py16
-rw-r--r--test/orm/inheritance/basic.py2
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."""