summaryrefslogtreecommitdiff
path: root/test/engine/metadata.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/engine/metadata.py')
-rw-r--r--test/engine/metadata.py85
1 files changed, 82 insertions, 3 deletions
diff --git a/test/engine/metadata.py b/test/engine/metadata.py
index 923f0334e..dd4ee51d3 100644
--- a/test/engine/metadata.py
+++ b/test/engine/metadata.py
@@ -2,8 +2,9 @@ import testenv; testenv.configure_for_tests()
from sqlalchemy import *
from sqlalchemy import exceptions
from testlib import *
+import pickle
-class MetaDataTest(PersistTest):
+class MetaDataTest(PersistTest, ComparesTables):
def test_metadata_connect(self):
metadata = MetaData()
t1 = Table('table1', metadata, Column('col1', Integer, primary_key=True),
@@ -29,10 +30,88 @@ class MetaDataTest(PersistTest):
t2 = Table('table1', metadata, Column('col1', Integer, primary_key=True),
Column('col2', String(20)))
assert False
- except exceptions.ArgumentError, e:
- assert str(e) == "Table 'table1' is already defined for this MetaData instance."
+ except exceptions.InvalidRequestError, e:
+ assert str(e) == "Table 'table1' is already defined for this MetaData instance. Specify 'useexisting=True' to redefine options and columns on an existing Table object."
finally:
metadata.drop_all()
+ @testing.exclude('mysql', '<', (4, 1, 1))
+ def test_to_metadata(self):
+ meta = MetaData()
+
+ table = Table('mytable', meta,
+ Column('myid', Integer, primary_key=True),
+ Column('name', String(40), nullable=False),
+ Column('description', String(30), CheckConstraint("description='hi'")),
+ UniqueConstraint('name'),
+ test_needs_fk=True,
+ )
+
+ table2 = Table('othertable', meta,
+ Column('id', Integer, primary_key=True),
+ Column('myid', Integer, ForeignKey('mytable.myid')),
+ test_needs_fk=True,
+ )
+
+ def test_to_metadata():
+ meta2 = MetaData()
+ table_c = table.tometadata(meta2)
+ table2_c = table2.tometadata(meta2)
+ return (table_c, table2_c)
+
+ def test_pickle():
+ meta.bind = testing.db
+ meta2 = pickle.loads(pickle.dumps(meta))
+ assert meta2.bind is None
+ meta3 = pickle.loads(pickle.dumps(meta2))
+ return (meta2.tables['mytable'], meta2.tables['othertable'])
+
+ def test_pickle_via_reflect():
+ # this is the most common use case, pickling the results of a
+ # database reflection
+ meta2 = MetaData(bind=testing.db)
+ t1 = Table('mytable', meta2, autoload=True)
+ t2 = Table('othertable', meta2, autoload=True)
+ meta3 = pickle.loads(pickle.dumps(meta2))
+ assert meta3.bind is None
+ assert meta3.tables['mytable'] is not t1
+ return (meta3.tables['mytable'], meta3.tables['othertable'])
+
+ meta.create_all(testing.db)
+ try:
+ for test, has_constraints in ((test_to_metadata, True), (test_pickle, True), (test_pickle_via_reflect, False)):
+ table_c, table2_c = test()
+ self.assert_tables_equal(table, table_c)
+ self.assert_tables_equal(table2, table2_c)
+
+ assert table is not table_c
+ assert table.primary_key is not table_c.primary_key
+ assert list(table2_c.c.myid.foreign_keys)[0].column is table_c.c.myid
+ assert list(table2_c.c.myid.foreign_keys)[0].column is not table.c.myid
+
+ # constraints dont get reflected for any dialect right now
+ if has_constraints:
+ for c in table_c.c.description.constraints:
+ if isinstance(c, CheckConstraint):
+ break
+ else:
+ assert False
+ assert c.sqltext=="description='hi'"
+
+ for c in table_c.constraints:
+ if isinstance(c, UniqueConstraint):
+ break
+ else:
+ assert False
+ assert c.columns.contains_column(table_c.c.name)
+ assert not c.columns.contains_column(table.c.name)
+ finally:
+ meta.drop_all(testing.db)
+
+ def test_nonexistent(self):
+ self.assertRaises(exceptions.NoSuchTableError, Table,
+ 'fake_table',
+ MetaData(testing.db), autoload=True)
+
if __name__ == '__main__':
testenv.main()