summaryrefslogtreecommitdiff
path: root/test/dialect/test_sqlite.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2014-08-09 14:03:17 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2014-08-09 14:03:17 -0400
commitcca4d8fc73df042e938447ec0bc990be28c4fb11 (patch)
treeec160bb29bf0d3491af3e1afa2583c280d7c58ec /test/dialect/test_sqlite.py
parent4b51c49dcd567a4369077c687bb0ba1e7f75784c (diff)
downloadsqlalchemy-cca4d8fc73df042e938447ec0bc990be28c4fb11.tar.gz
- add tests for the savepoint recipe
Diffstat (limited to 'test/dialect/test_sqlite.py')
-rw-r--r--test/dialect/test_sqlite.py78
1 files changed, 78 insertions, 0 deletions
diff --git a/test/dialect/test_sqlite.py b/test/dialect/test_sqlite.py
index 4099b54d7..e77a03980 100644
--- a/test/dialect/test_sqlite.py
+++ b/test/dialect/test_sqlite.py
@@ -11,6 +11,7 @@ from sqlalchemy import Table, select, bindparam, Column,\
UniqueConstraint
from sqlalchemy.types import Integer, String, Boolean, DateTime, Date, Time
from sqlalchemy import types as sqltypes
+from sqlalchemy import event
from sqlalchemy.util import u, ue
from sqlalchemy import exc, sql, schema, pool, util
from sqlalchemy.dialects.sqlite import base as sqlite, \
@@ -949,6 +950,83 @@ class ReflectFKConstraintTest(fixtures.TestBase):
)
+class SavepointTest(fixtures.TablesTest):
+ """test that savepoints work when we use the correct event setup"""
+ __only_on__ = 'sqlite'
+
+ @classmethod
+ def define_tables(cls, metadata):
+ Table(
+ 'users', metadata,
+ Column('user_id', Integer, primary_key=True),
+ Column('user_name', String)
+ )
+
+ @classmethod
+ def setup_bind(cls):
+ engine = engines.testing_engine(options={"use_reaper": False})
+
+ @event.listens_for(engine, "connect")
+ def do_connect(dbapi_connection, connection_record):
+ # disable pysqlite's emitting of the BEGIN statement entirely.
+ # also stops it from emitting COMMIT before any DDL.
+ dbapi_connection.isolation_level = None
+
+ @event.listens_for(engine, "begin")
+ def do_begin(conn):
+ # emit our own BEGIN
+ conn.execute("BEGIN")
+
+ return engine
+
+ def test_nested_subtransaction_rollback(self):
+ users = self.tables.users
+ connection = self.bind.connect()
+ transaction = connection.begin()
+ connection.execute(users.insert(), user_id=1, user_name='user1')
+ trans2 = connection.begin_nested()
+ connection.execute(users.insert(), user_id=2, user_name='user2')
+ trans2.rollback()
+ connection.execute(users.insert(), user_id=3, user_name='user3')
+ transaction.commit()
+ eq_(connection.execute(select([users.c.user_id]).
+ order_by(users.c.user_id)).fetchall(),
+ [(1, ), (3, )])
+ connection.close()
+
+ def test_nested_subtransaction_commit(self):
+ users = self.tables.users
+ connection = self.bind.connect()
+ transaction = connection.begin()
+ connection.execute(users.insert(), user_id=1, user_name='user1')
+ trans2 = connection.begin_nested()
+ connection.execute(users.insert(), user_id=2, user_name='user2')
+ trans2.commit()
+ connection.execute(users.insert(), user_id=3, user_name='user3')
+ transaction.commit()
+ eq_(connection.execute(select([users.c.user_id]).
+ order_by(users.c.user_id)).fetchall(),
+ [(1, ), (2, ), (3, )])
+ connection.close()
+
+ def test_rollback_to_subtransaction(self):
+ users = self.tables.users
+ connection = self.bind.connect()
+ transaction = connection.begin()
+ connection.execute(users.insert(), user_id=1, user_name='user1')
+ trans2 = connection.begin_nested()
+ connection.execute(users.insert(), user_id=2, user_name='user2')
+ trans3 = connection.begin()
+ connection.execute(users.insert(), user_id=3, user_name='user3')
+ trans3.rollback()
+ connection.execute(users.insert(), user_id=4, user_name='user4')
+ transaction.commit()
+ eq_(connection.execute(select([users.c.user_id]).
+ order_by(users.c.user_id)).fetchall(),
+ [(1, ), (4, )])
+ connection.close()
+
+
class TypeReflectionTest(fixtures.TestBase):
__only_on__ = 'sqlite'