Files

208 lines
7.2 KiB
Python

"""tests the "bind" attribute/argument across schema, SQL, and ORM sessions,
including the deprecated versions of these arguments"""
import testbase
import unittest, sys, datetime
import tables
db = testbase.db
from sqlalchemy import *
class BindTest(testbase.PersistTest):
def test_create_drop_explicit(self):
metadata = MetaData()
table = Table('test_table', metadata,
Column('foo', Integer))
for bind in (
testbase.db,
testbase.db.connect()
):
for args in [
([], {'connectable':bind}),
([], {'bind':bind}),
([bind], {})
]:
metadata.create_all(*args[0], **args[1])
assert table.exists(*args[0], **args[1])
metadata.drop_all(*args[0], **args[1])
table.create(*args[0], **args[1])
table.drop(*args[0], **args[1])
assert not table.exists(*args[0], **args[1])
def test_create_drop_err(self):
metadata = MetaData()
table = Table('test_table', metadata,
Column('foo', Integer))
for meth in [
metadata.create_all,
table.exists,
metadata.drop_all,
table.create,
table.drop,
]:
try:
meth()
assert False
except exceptions.InvalidRequestError, e:
assert str(e) == "This SchemaItem is not connected to any Engine or Connection."
def test_create_drop_bound(self):
for meta in (MetaData,ThreadLocalMetaData):
for bind in (
testbase.db,
testbase.db.connect()
):
metadata = meta()
table = Table('test_table', metadata,
Column('foo', Integer))
metadata.bind = bind
assert metadata.bind is metadata.engine is table.bind is table.engine is bind
metadata.create_all()
assert table.exists()
metadata.drop_all()
table.create()
table.drop()
assert not table.exists()
metadata = meta()
table = Table('test_table', metadata,
Column('foo', Integer))
metadata.connect(bind)
assert metadata.bind is metadata.engine is table.bind is table.engine is bind
metadata.create_all()
assert table.exists()
metadata.drop_all()
table.create()
table.drop()
assert not table.exists()
if isinstance(bind, engine.Connection):
bind.close()
def test_create_drop_constructor_bound(self):
for bind in (
testbase.db,
testbase.db.connect()
):
try:
for args in (
([bind], {}),
([], {'engine_or_url':bind}),
([], {'bind':bind}),
([], {'engine':bind})
):
metadata = MetaData(*args[0], **args[1])
table = Table('test_table', metadata,
Column('foo', Integer))
assert metadata.bind is metadata.engine is table.bind is table.engine is bind
metadata.create_all()
assert table.exists()
metadata.drop_all()
table.create()
table.drop()
assert not table.exists()
finally:
if isinstance(bind, engine.Connection):
bind.close()
def test_implicit_execution(self):
metadata = MetaData()
table = Table('test_table', metadata,
Column('foo', Integer),
mysql_engine='InnoDB')
conn = testbase.db.connect()
metadata.create_all(bind=conn)
try:
trans = conn.begin()
metadata.bind = conn
t = table.insert()
assert t.bind is conn
table.insert().execute(foo=5)
table.insert().execute(foo=6)
table.insert().execute(foo=7)
trans.rollback()
metadata.bind = None
assert testbase.db.execute("select count(1) from test_table").scalar() == 0
finally:
metadata.drop_all(bind=conn)
def test_clauseelement(self):
metadata = MetaData()
table = Table('test_table', metadata,
Column('foo', Integer))
metadata.create_all(bind=testbase.db)
try:
for elem in [
table.select,
lambda **kwargs:func.current_timestamp(**kwargs).select(),
# func.current_timestamp().select,
lambda **kwargs:text("select * from test_table", **kwargs)
]:
for bind in (
testbase.db,
testbase.db.connect()
):
try:
e = elem(bind=bind)
assert e.bind is e.engine is bind
e.execute()
e = elem(engine=bind)
assert e.bind is e.engine is bind
e.execute()
finally:
if isinstance(bind, engine.Connection):
bind.close()
try:
e = elem()
assert e.bind is e.engine is None
e.execute()
assert False
except exceptions.InvalidRequestError, e:
assert str(e) == "This Compiled object is not bound to any Engine or Connection."
finally:
metadata.drop_all(bind=testbase.db)
def test_session(self):
metadata = MetaData()
table = Table('test_table', metadata,
Column('foo', Integer, primary_key=True),
Column('data', String(30)))
class Foo(object):
pass
mapper(Foo, table)
metadata.create_all(bind=testbase.db)
try:
for bind in (testbase.db, testbase.db.connect()):
try:
for args in ({'bind':bind}, {'bind_to':bind}):
sess = create_session(**args)
assert sess.bind is sess.bind_to is bind
f = Foo()
sess.save(f)
sess.flush()
assert sess.get(Foo, f.foo) is f
finally:
if isinstance(bind, engine.Connection):
bind.close()
sess = create_session()
f = Foo()
sess.save(f)
try:
sess.flush()
assert False
except exceptions.InvalidRequestError, e:
assert str(e).startswith("Could not locate any Engine or Connection bound to mapper")
finally:
metadata.drop_all(bind=testbase.db)
if __name__ == '__main__':
testbase.main()