summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Kirtland <jek@discorporate.us>2007-10-19 07:02:48 +0000
committerJason Kirtland <jek@discorporate.us>2007-10-19 07:02:48 +0000
commit974f59f091d562bb0e141c6b4087160d16190c1c (patch)
tree59d1b683d2fa09151f592712bb14f380830b2e6d
parentf32131dac212fdee1a6e97eba4a4ed21e51b3607 (diff)
downloadsqlalchemy-974f59f091d562bb0e141c6b4087160d16190c1c.tar.gz
Fixed empty (zero column) sqlite inserts, allowing inserts on
autoincrementing single column tables.
-rw-r--r--CHANGES10
-rw-r--r--lib/sqlalchemy/databases/sqlite.py15
-rw-r--r--test/dialect/sqlite.py63
3 files changed, 86 insertions, 2 deletions
diff --git a/CHANGES b/CHANGES
index f86adc4c6..eab3ec137 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,13 +1,19 @@
=======
CHANGES
=======
+
0.4.1
-----
-- added test coverage for unknown type reflection, fixed
- sqlite/mysql handling of type reflection for unknown types
+
+- Added test coverage for unknown type reflection, fixed sqlite/mysql
+ handling of type reflection for unknown types.
+
+- Fixed empty (zero column) sqlite inserts, allowing inserts on
+ autoincrementing single column tables.
0.4.0
-----
+
- (see 0.4.0beta1 for the start of major changes against 0.3,
as well as http://www.sqlalchemy.org/trac/wiki/WhatsNewIn04 )
diff --git a/lib/sqlalchemy/databases/sqlite.py b/lib/sqlalchemy/databases/sqlite.py
index 99a1d5650..6666f6066 100644
--- a/lib/sqlalchemy/databases/sqlite.py
+++ b/lib/sqlalchemy/databases/sqlite.py
@@ -362,6 +362,21 @@ class SQLiteCompiler(compiler.DefaultCompiler):
# sqlite has no "FOR UPDATE" AFAICT
return ''
+ def visit_insert(self, insert_stmt):
+ self.isinsert = True
+ colparams = self._get_colparams(insert_stmt)
+ preparer = self.preparer
+
+ if not colparams:
+ 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),
+ ', '.join([preparer.format_column(c[0])
+ for c in colparams]),
+ ', '.join([c[1] for c in colparams])))
+
class SQLiteSchemaGenerator(compiler.SchemaGenerator):
diff --git a/test/dialect/sqlite.py b/test/dialect/sqlite.py
index 43ee9e6a3..e401859bc 100644
--- a/test/dialect/sqlite.py
+++ b/test/dialect/sqlite.py
@@ -3,6 +3,7 @@
import testbase
import datetime
from sqlalchemy import *
+from sqlalchemy import exceptions
from sqlalchemy.databases import sqlite
from testlib import *
@@ -85,5 +86,67 @@ class DialectTest(AssertMixin):
testbase.db.execute("drop table django_content_type")
+class InsertTest(AssertMixin):
+ """Tests inserts and autoincrement."""
+
+ def _test_empty_insert(self, table, expect=1):
+ try:
+ table.create()
+ for wanted in (expect, expect * 2):
+
+ table.insert().execute()
+
+ rows = table.select().execute().fetchall()
+ print rows
+ self.assertEquals(len(rows), wanted)
+ finally:
+ table.drop()
+
+ @testing.supported('sqlite')
+ def test_empty_insert_pk1(self):
+ self._test_empty_insert(
+ Table('a', MetaData(testbase.db),
+ Column('id', Integer, primary_key=True)))
+
+ @testing.supported('sqlite')
+ def test_empty_insert_pk2(self):
+ self.assertRaises(
+ exceptions.DBAPIError,
+ self._test_empty_insert,
+ Table('b', MetaData(testbase.db),
+ Column('x', Integer, primary_key=True),
+ Column('y', Integer, primary_key=True)))
+
+ @testing.supported('sqlite')
+ def test_empty_insert_pk3(self):
+ self.assertRaises(
+ exceptions.DBAPIError,
+ self._test_empty_insert,
+ Table('c', MetaData(testbase.db),
+ Column('x', Integer, primary_key=True),
+ Column('y', Integer, PassiveDefault('123'),
+ primary_key=True)))
+
+ @testing.supported('sqlite')
+ def test_empty_insert_pk4(self):
+ self._test_empty_insert(
+ Table('d', MetaData(testbase.db),
+ Column('x', Integer, primary_key=True),
+ Column('y', Integer, PassiveDefault('123'))))
+
+ @testing.supported('sqlite')
+ def test_empty_insert_nopk1(self):
+ self._test_empty_insert(
+ Table('e', MetaData(testbase.db),
+ Column('id', Integer)))
+
+ @testing.supported('sqlite')
+ def test_empty_insert_nopk2(self):
+ self._test_empty_insert(
+ Table('f', MetaData(testbase.db),
+ Column('x', Integer),
+ Column('y', Integer)))
+
+
if __name__ == "__main__":
testbase.main()