221
223
eq_(len(b2.constraints), 2)
223
225
@testing.provide_metadata
226
def test_autoload_replace_foreign_key_ispresent(self):
227
"""test autoload_replace=False with col plus FK mirroring
228
DB-reflected FK skips the reflected FK and installs
229
the in-python one only.
232
Table('a', self.metadata, Column('id', Integer, primary_key=True))
233
Table('b', self.metadata, Column('id', Integer, primary_key=True),
234
Column('a_id', Integer, sa.ForeignKey('a.id')))
235
self.metadata.create_all()
238
b2 = Table('b', m2, Column('a_id', Integer, sa.ForeignKey('a.id')))
239
a2 = Table('a', m2, autoload=True, autoload_with=testing.db)
240
b2 = Table('b', m2, extend_existing=True, autoload=True,
241
autoload_with=testing.db,
242
autoload_replace=False)
244
assert b2.c.id is not None
245
assert b2.c.a_id.references(a2.c.id)
246
eq_(len(b2.constraints), 2)
248
@testing.provide_metadata
249
def test_autoload_replace_foreign_key_removed(self):
250
"""test autoload_replace=False with col minus FK that's in the
251
DB means the FK is skipped and doesn't get installed at all.
254
Table('a', self.metadata, Column('id', Integer, primary_key=True))
255
Table('b', self.metadata, Column('id', Integer, primary_key=True),
256
Column('a_id', Integer, sa.ForeignKey('a.id')))
257
self.metadata.create_all()
260
b2 = Table('b', m2, Column('a_id', Integer))
261
a2 = Table('a', m2, autoload=True, autoload_with=testing.db)
262
b2 = Table('b', m2, extend_existing=True, autoload=True,
263
autoload_with=testing.db,
264
autoload_replace=False)
266
assert b2.c.id is not None
267
assert not b2.c.a_id.references(a2.c.id)
268
eq_(len(b2.constraints), 1)
270
@testing.provide_metadata
224
271
def test_autoload_replace_primary_key(self):
225
a = Table('a', self.metadata, Column('id', Integer))
272
Table('a', self.metadata, Column('id', Integer))
226
273
self.metadata.create_all()
696
743
meta.create_all()
698
745
meta2 = MetaData(testing.db)
699
table_a2 = Table('select', meta2, autoload=True)
700
table_b2 = Table('false', meta2, autoload=True)
701
table_c2 = Table('is', meta2, autoload=True)
746
Table('select', meta2, autoload=True)
747
Table('false', meta2, autoload=True)
748
Table('is', meta2, autoload=True)
750
@testing.provide_metadata
751
def _test_reflect_uses_bind(self, fn):
752
from sqlalchemy.pool import AssertionPool
753
e = engines.testing_engine(options={"poolclass": AssertionPool})
756
@testing.uses_deprecated
757
def test_reflect_uses_bind_constructor_conn(self):
758
self._test_reflect_uses_bind(lambda e: MetaData(e.connect(),
761
@testing.uses_deprecated
762
def test_reflect_uses_bind_constructor_engine(self):
763
self._test_reflect_uses_bind(lambda e: MetaData(e, reflect=True))
765
def test_reflect_uses_bind_constructor_conn_reflect(self):
766
self._test_reflect_uses_bind(lambda e: MetaData(e.connect()).reflect())
768
def test_reflect_uses_bind_constructor_engine_reflect(self):
769
self._test_reflect_uses_bind(lambda e: MetaData(e).reflect())
771
def test_reflect_uses_bind_conn_reflect(self):
772
self._test_reflect_uses_bind(lambda e: MetaData().reflect(e.connect()))
774
def test_reflect_uses_bind_engine_reflect(self):
775
self._test_reflect_uses_bind(lambda e: MetaData().reflect(e))
703
777
@testing.provide_metadata
704
778
def test_reflect_all(self):
705
779
existing = testing.db.table_names()
707
names = ['rt_%s' % name for name in ('a','b','c','d','e')]
781
names = ['rt_%s' % name for name in ('a', 'b', 'c', 'd', 'e')]
708
782
nameset = set(names)
709
783
for name in names:
710
784
# be sure our starting environment is sane
1166
1239
'test_schema.email_addresses'])
1169
class HasSequenceTest(fixtures.TestBase):
1171
@testing.requires.sequences
1172
def test_has_sequence(self):
1173
metadata = MetaData()
1174
users = Table('users', metadata, Column('user_id', sa.Integer,
1175
sa.Sequence('user_id_seq'), primary_key=True),
1176
Column('user_name', sa.String(40)))
1177
metadata.create_all(bind=testing.db)
1179
eq_(testing.db.dialect.has_sequence(testing.db,
1180
'user_id_seq'), True)
1182
metadata.drop_all(bind=testing.db)
1183
eq_(testing.db.dialect.has_sequence(testing.db, 'user_id_seq'),
1186
1242
@testing.requires.schemas
1187
@testing.requires.sequences
1188
def test_has_sequence_schema(self):
1189
test_schema = 'test_schema'
1190
s1 = sa.Sequence('user_id_seq', schema=test_schema)
1191
s2 = sa.Sequence('user_id_seq')
1192
testing.db.execute(schema.CreateSequence(s1))
1193
testing.db.execute(schema.CreateSequence(s2))
1194
eq_(testing.db.dialect.has_sequence(testing.db, 'user_id_seq',
1195
schema=test_schema), True)
1196
eq_(testing.db.dialect.has_sequence(testing.db, 'user_id_seq'),
1198
testing.db.execute(schema.DropSequence(s1))
1199
eq_(testing.db.dialect.has_sequence(testing.db, 'user_id_seq',
1200
schema=test_schema), False)
1201
eq_(testing.db.dialect.has_sequence(testing.db, 'user_id_seq'),
1203
testing.db.execute(schema.DropSequence(s2))
1204
eq_(testing.db.dialect.has_sequence(testing.db, 'user_id_seq',
1205
schema=test_schema), False)
1206
eq_(testing.db.dialect.has_sequence(testing.db, 'user_id_seq'),
1243
@testing.requires.cross_schema_fk_reflection
1244
@testing.provide_metadata
1245
def test_reflect_all_schemas_default_overlap(self):
1246
t1 = Table('t', self.metadata,
1247
Column('id', Integer, primary_key=True))
1249
t2 = Table('t', self.metadata,
1250
Column('id1', sa.ForeignKey('t.id')),
1251
schema="test_schema"
1254
self.metadata.create_all()
1256
m2.reflect(testing.db, schema="test_schema")
1259
m3.reflect(testing.db)
1260
m3.reflect(testing.db, schema="test_schema")
1263
set((t.name, t.schema) for t in m2.tables.values()),
1264
set((t.name, t.schema) for t in m3.tables.values())
1358
1416
eq_(t2.name, "sOmEtAbLe")
1361
class ComponentReflectionTest(fixtures.TestBase):
1363
@testing.requires.schemas
1364
def test_get_schema_names(self):
1365
insp = Inspector(testing.db)
1367
self.assert_('test_schema' in insp.get_schema_names())
1369
def test_dialect_initialize(self):
1370
engine = engines.testing_engine()
1371
assert not hasattr(engine.dialect, 'default_schema_name')
1372
insp = Inspector(engine)
1373
assert hasattr(engine.dialect, 'default_schema_name')
1375
def test_get_default_schema_name(self):
1376
insp = Inspector(testing.db)
1377
eq_(insp.default_schema_name, testing.db.dialect.default_schema_name)
1379
@testing.provide_metadata
1380
def _test_get_table_names(self, schema=None, table_type='table',
1382
meta = self.metadata
1383
users, addresses, dingalings = createTables(meta, schema)
1385
_create_views(meta.bind, schema)
1387
insp = Inspector(meta.bind)
1388
if table_type == 'view':
1389
table_names = insp.get_view_names(schema)
1391
answer = ['email_addresses_v', 'users_v']
1393
table_names = insp.get_table_names(schema,
1395
if order_by == 'foreign_key':
1396
answer = ['dingalings', 'email_addresses', 'users']
1397
eq_(table_names, answer)
1399
answer = ['dingalings', 'email_addresses', 'users']
1400
eq_(sorted(table_names), answer)
1402
_drop_views(meta.bind, schema)
1404
def test_get_table_names(self):
1405
self._test_get_table_names()
1407
def test_get_table_names_fks(self):
1408
self._test_get_table_names(order_by='foreign_key')
1410
@testing.requires.schemas
1411
def test_get_table_names_with_schema(self):
1412
self._test_get_table_names('test_schema')
1414
@testing.requires.views
1415
def test_get_view_names(self):
1416
self._test_get_table_names(table_type='view')
1418
@testing.requires.schemas
1419
def test_get_view_names_with_schema(self):
1420
self._test_get_table_names('test_schema', table_type='view')
1422
def _test_get_columns(self, schema=None, table_type='table'):
1423
meta = MetaData(testing.db)
1424
users, addresses, dingalings = createTables(meta, schema)
1425
table_names = ['users', 'email_addresses']
1427
if table_type == 'view':
1428
_create_views(meta.bind, schema)
1429
table_names = ['users_v', 'email_addresses_v']
1431
insp = Inspector(meta.bind)
1432
for table_name, table in zip(table_names, (users,
1434
schema_name = schema
1435
cols = insp.get_columns(table_name, schema=schema_name)
1436
self.assert_(len(cols) > 0, len(cols))
1438
# should be in order
1440
for i, col in enumerate(table.columns):
1441
eq_(col.name, cols[i]['name'])
1442
ctype = cols[i]['type'].__class__
1443
ctype_def = col.type
1444
if isinstance(ctype_def, sa.types.TypeEngine):
1445
ctype_def = ctype_def.__class__
1447
# Oracle returns Date for DateTime.
1449
if testing.against('oracle') and ctype_def \
1450
in (sql_types.Date, sql_types.DateTime):
1451
ctype_def = sql_types.Date
1453
# assert that the desired type and return type share
1454
# a base within one of the generic types.
1456
self.assert_(len(set(ctype.__mro__).
1457
intersection(ctype_def.__mro__).intersection([
1465
])) > 0, '%s(%s), %s(%s)' % (col.name,
1466
col.type, cols[i]['name'], ctype))
1468
if table_type == 'view':
1469
_drop_views(meta.bind, schema)
1472
def test_get_columns(self):
1473
self._test_get_columns()
1475
@testing.requires.schemas
1476
def test_get_columns_with_schema(self):
1477
self._test_get_columns(schema='test_schema')
1479
@testing.requires.views
1480
def test_get_view_columns(self):
1481
self._test_get_columns(table_type='view')
1483
@testing.requires.views
1484
@testing.requires.schemas
1485
def test_get_view_columns_with_schema(self):
1486
self._test_get_columns(schema='test_schema', table_type='view')
1488
@testing.provide_metadata
1489
def _test_get_primary_keys(self, schema=None):
1490
meta = self.metadata
1491
users, addresses, dingalings = createTables(meta, schema)
1493
insp = Inspector(meta.bind)
1494
users_pkeys = insp.get_primary_keys(users.name,
1496
eq_(users_pkeys, ['user_id'])
1497
addr_cons = insp.get_pk_constraint(addresses.name,
1500
addr_pkeys = addr_cons['constrained_columns']
1501
eq_(addr_pkeys, ['address_id'])
1503
@testing.requires.reflects_pk_names
1505
eq_(addr_cons['name'], 'email_ad_pk')
1508
def test_get_primary_keys(self):
1509
self._test_get_primary_keys()
1511
@testing.fails_on('sqlite', 'no schemas')
1512
def test_get_primary_keys_with_schema(self):
1513
self._test_get_primary_keys(schema='test_schema')
1515
@testing.provide_metadata
1516
def _test_get_foreign_keys(self, schema=None):
1517
meta = self.metadata
1518
users, addresses, dingalings = createTables(meta, schema)
1520
insp = Inspector(meta.bind)
1521
expected_schema = schema
1523
users_fkeys = insp.get_foreign_keys(users.name,
1525
fkey1 = users_fkeys[0]
1527
@testing.fails_on('sqlite', 'no support for constraint names')
1529
self.assert_(fkey1['name'] is not None)
1532
eq_(fkey1['referred_schema'], expected_schema)
1533
eq_(fkey1['referred_table'], users.name)
1534
eq_(fkey1['referred_columns'], ['user_id', ])
1535
eq_(fkey1['constrained_columns'], ['parent_user_id'])
1537
addr_fkeys = insp.get_foreign_keys(addresses.name,
1539
fkey1 = addr_fkeys[0]
1540
@testing.fails_on('sqlite', 'no support for constraint names')
1542
self.assert_(fkey1['name'] is not None)
1544
eq_(fkey1['referred_schema'], expected_schema)
1545
eq_(fkey1['referred_table'], users.name)
1546
eq_(fkey1['referred_columns'], ['user_id', ])
1547
eq_(fkey1['constrained_columns'], ['remote_user_id'])
1549
def test_get_foreign_keys(self):
1550
self._test_get_foreign_keys()
1552
@testing.requires.schemas
1553
def test_get_foreign_keys_with_schema(self):
1554
self._test_get_foreign_keys(schema='test_schema')
1556
@testing.provide_metadata
1557
def _test_get_indexes(self, schema=None):
1558
meta = self.metadata
1559
users, addresses, dingalings = createTables(meta, schema)
1561
createIndexes(meta.bind, schema)
1562
# The database may decide to create indexes for foreign keys, etc.
1563
# so there may be more indexes than expected.
1564
insp = Inspector(meta.bind)
1565
indexes = insp.get_indexes('users', schema=schema)
1566
expected_indexes = [
1568
'column_names': ['test1', 'test2'],
1569
'name': 'users_t_idx'}]
1570
index_names = [d['name'] for d in indexes]
1571
for e_index in expected_indexes:
1572
assert e_index['name'] in index_names
1573
index = indexes[index_names.index(e_index['name'])]
1575
eq_(e_index[key], index[key])
1577
def test_get_indexes(self):
1578
self._test_get_indexes()
1580
@testing.requires.schemas
1581
def test_get_indexes_with_schema(self):
1582
self._test_get_indexes(schema='test_schema')
1584
@testing.provide_metadata
1585
def _test_get_view_definition(self, schema=None):
1586
meta = self.metadata
1587
users, addresses, dingalings = createTables(meta, schema)
1589
_create_views(meta.bind, schema)
1590
view_name1 = 'users_v'
1591
view_name2 = 'email_addresses_v'
1593
insp = Inspector(meta.bind)
1594
v1 = insp.get_view_definition(view_name1, schema=schema)
1596
v2 = insp.get_view_definition(view_name2, schema=schema)
1599
_drop_views(meta.bind, schema)
1601
@testing.requires.views
1602
def test_get_view_definition(self):
1603
self._test_get_view_definition()
1605
@testing.requires.views
1606
@testing.requires.schemas
1607
def test_get_view_definition_with_schema(self):
1608
self._test_get_view_definition(schema='test_schema')
1610
@testing.only_on("postgresql", "PG specific feature")
1611
@testing.provide_metadata
1612
def _test_get_table_oid(self, table_name, schema=None):
1613
meta = self.metadata
1614
users, addresses, dingalings = createTables(meta, schema)
1616
insp = create_inspector(meta.bind)
1617
oid = insp.get_table_oid(table_name, schema)
1618
self.assert_(isinstance(oid, (int, long)))
1620
def test_get_table_oid(self):
1621
self._test_get_table_oid('users')
1623
@testing.requires.schemas
1624
def test_get_table_oid_with_schema(self):
1625
self._test_get_table_oid('users', schema='test_schema')
1627
1420
class ColumnEventsTest(fixtures.TestBase):